]> gcc.gnu.org Git - gcc.git/commitdiff
class.c (add_method): Disallow destructor for java classes.
authorNathan Sidwell <nathan@codesourcery.com>
Mon, 15 Dec 2003 14:19:10 +0000 (14:19 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Mon, 15 Dec 2003 14:19:10 +0000 (14:19 +0000)
cp:
* class.c (add_method): Disallow destructor for java classes.
* decl.c (xref_basetypes): Check java class inheritance.
* decl2.c (check_java_method): Skip artificial params.
testsuite:
* g++.dg/other/java1.C: New test.

From-SVN: r74629

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/decl.c
gcc/cp/decl2.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/java1.C [new file with mode: 0644]

index 5d70a54f5a6aa58d0bca508fea0107d262cd0ba0..93a37190a0a4d2d9d9034b104c54e4c1e1949c9e 100644 (file)
@@ -1,5 +1,9 @@
 2003-12-15  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * class.c (add_method): Disallow destructor for java classes.
+       * decl.c (xref_basetypes): Check java class inheritance.
+       * decl2.c (check_java_method): Skip artificial params.
+
        PR c++/13241
        C++ ABI change. Mangling of symbols in expressions.
        * mangle.c (write_mangled_name): Add top_level flag. Rework for
index 2da8f8d5659893eacccd821790c9eb056d337676..55e9797e3e8be1463fdc9ee732aca24247c351ea 100644 (file)
@@ -755,6 +755,12 @@ add_method (tree type, tree method, int error_p)
     {
       slot = CLASSTYPE_DESTRUCTOR_SLOT;
       TYPE_HAS_DESTRUCTOR (type) = 1;
+      
+      if (TYPE_FOR_JAVA (type))
+       error (DECL_ARTIFICIAL (method)
+              ? "Java class '%T' cannot have an implicit non-trivial destructor"
+              : "Java class '%T' cannot have a destructor",
+              DECL_CONTEXT (method));
     }
   else
     {
index 539bf19f6401e3e347a76f2114b845f6ec5a1679..1eafe2eb2dedb06c7fcba81beaeeca19cbb186d9 100644 (file)
@@ -9625,7 +9625,15 @@ xref_basetypes (tree ref, tree base_list)
      inheritance order chain.  */
   copy_base_binfos (TYPE_BINFO (ref), ref, NULL_TREE);
   CLASSTYPE_VBASECLASSES (ref) = nreverse (CLASSTYPE_VBASECLASSES (ref));
-  
+
+  if (TYPE_FOR_JAVA (ref))
+    {
+      if (TYPE_USES_MULTIPLE_INHERITANCE (ref))
+       error ("Java class '%T' cannot have multiple bases", ref);
+      if (CLASSTYPE_VBASECLASSES (ref))
+       error ("Java class '%T' cannot have virtual bases", ref);
+    }
+
   /* Unmark all the types.  */
   while (i--)
     {
index b7774c45df865b5e3c18f4585cd8d057173ea31f..14814b532dd561e5540655e0382661e4a83ac0eb 100644 (file)
@@ -622,12 +622,20 @@ check_java_method (tree method)
   bool jerr = false;
   tree arg_types = TYPE_ARG_TYPES (TREE_TYPE (method));
   tree ret_type = TREE_TYPE (TREE_TYPE (method));
+
   if (!acceptable_java_type (ret_type))
     {
       error ("Java method '%D' has non-Java return type `%T'",
                method, ret_type);
       jerr = true;
     }
+
+  arg_types = TREE_CHAIN (arg_types);
+  if (DECL_HAS_IN_CHARGE_PARM_P (method))
+    arg_types = TREE_CHAIN (arg_types);
+  if (DECL_HAS_VTT_PARM_P (method))
+    arg_types = TREE_CHAIN (arg_types);
+  
   for (; arg_types != NULL_TREE; arg_types = TREE_CHAIN (arg_types))
     {
       tree type = TREE_VALUE (arg_types);
index 2d2d7cccf3a70179e39d7d7c0539c5bf7366507c..675122eac52d8f1b7e5e753cf8040e15f6f5b925 100644 (file)
@@ -1,5 +1,7 @@
 2003-12-15  Nathan Sidwell  <nathan@codesourcery.com>
 
+       * g++.dg/other/java1.C: New test.
+
        PR c++/13241
        * g++.dg/abi/mangle18-1.C: New test.
        * g++.dg/abi/mangle18-2.C: New test.
diff --git a/gcc/testsuite/g++.dg/other/java1.C b/gcc/testsuite/g++.dg/other/java1.C
new file mode 100644 (file)
index 0000000..38b5e0c
--- /dev/null
@@ -0,0 +1,22 @@
+// { dg-options "-w -ansi -pedantic" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 23 Oct 2003 <nathan@codesourcery.com>
+
+extern "Java" {
+  class One 
+  {
+    ~One (); // { dg-error "cannot have a destructor" "" }
+    One ();
+  };
+
+  class Two {};
+
+  class Three : One {}; // { dg-error "cannot have an implicit" "" }
+
+  class Four : Two {};
+
+  class Five : Two, Four {}; //  { dg-error "cannot have multiple bases" "" }
+
+  class Six : virtual Two {}; // { dg-error "cannot have virtual base" "" }
+}
This page took 0.137368 seconds and 5 git commands to generate.