From f5c28a158bb972bef91b18028e1965722b5cff69 Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Mon, 15 Dec 2003 14:19:10 +0000 Subject: [PATCH] class.c (add_method): Disallow destructor for java classes. 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 | 4 ++++ gcc/cp/class.c | 6 ++++++ gcc/cp/decl.c | 10 +++++++++- gcc/cp/decl2.c | 8 ++++++++ gcc/testsuite/ChangeLog | 2 ++ gcc/testsuite/g++.dg/other/java1.C | 22 ++++++++++++++++++++++ 6 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.dg/other/java1.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5d70a54f5a6..93a37190a0a 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2003-12-15 Nathan Sidwell + * 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 diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 2da8f8d5659..55e9797e3e8 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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 { diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 539bf19f640..1eafe2eb2de 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -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--) { diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index b7774c45df8..14814b532dd 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2d2d7cccf3a..675122eac52 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,7 @@ 2003-12-15 Nathan Sidwell + * 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 index 00000000000..38b5e0c3070 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/java1.C @@ -0,0 +1,22 @@ +// { dg-options "-w -ansi -pedantic" } + +// Copyright (C) 2003 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 23 Oct 2003 + +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" "" } +} -- 2.30.2