From: Volker Reichelt Date: Fri, 23 Jun 2006 15:59:51 +0000 (+0000) Subject: re PR c++/11468 (Deriving from CNI class java::lang::Object causing an ICE) X-Git-Tag: releases/gcc-4.2.0~2303 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a3d536f1c1c0aa3d414c17c4acc44c900b1f1e38;p=thirdparty%2Fgcc.git re PR c++/11468 (Deriving from CNI class java::lang::Object causing an ICE) PR c++/11468 * init.c (build_new_1): Handle error_mark_nodes returned by build_java_class_ref. (build_java_class_ref): Do not abort compilation, but return error_mark_node. Improve error message. Fix indentation. * g++.dg/other/java2.C: New test. From-SVN: r114937 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 30c66d30b5a5..2f726bdf8edf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2006-06-23 Volker Reichelt + + PR c++/11468 + * init.c (build_new_1): Handle error_mark_nodes returned by + build_java_class_ref. + (build_java_class_ref): Do not abort compilation, but return + error_mark_node. Improve error message. Fix indentation. + 2006-06-23 Danny Smith PR target/27789 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 357cba998126..c785308699f8 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1696,6 +1696,9 @@ build_new_1 (tree placement, tree type, tree nelts, tree init, tree class_decl = build_java_class_ref (elt_type); static const char alloc_name[] = "_Jv_AllocObject"; + if (class_decl == error_mark_node) + return error_mark_node; + use_java_new = 1; if (!get_global_value_if_present (get_identifier (alloc_name), &alloc_fn)) @@ -2148,8 +2151,10 @@ build_java_class_ref (tree type) { jclass_node = IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass")); if (jclass_node == NULL_TREE) - fatal_error ("call to Java constructor, while % undefined"); - + { + error ("call to Java constructor, while % undefined"); + return error_mark_node; + } jclass_node = TREE_TYPE (jclass_node); } @@ -2164,8 +2169,11 @@ build_java_class_ref (tree type) break; } if (!field) - internal_error ("can't find class$"); - } + { + error ("can't find % in %qT", type); + return error_mark_node; + } + } class_decl = IDENTIFIER_GLOBAL_VALUE (name); if (class_decl == NULL_TREE) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b9204ecb7268..3b3dc6bac2fc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-06-23 Volker Reichelt + + PR c++/11468 + * g++.dg/other/java2.C: New test. + 2006-06-23 Danny Smith PR target/27789 diff --git a/gcc/testsuite/g++.dg/other/java2.C b/gcc/testsuite/g++.dg/other/java2.C new file mode 100644 index 000000000000..8ba4d5a72c84 --- /dev/null +++ b/gcc/testsuite/g++.dg/other/java2.C @@ -0,0 +1,11 @@ +// PR c++/??? +// { dg-do compile } + +extern "Java" +{ + struct A {}; +} + +typedef void* jclass; + +A* p = new A; // { dg-error "class\\$" }