OSDN Git Service

PR c++/11468
authorreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Jun 2006 15:59:51 +0000 (15:59 +0000)
committerreichelt <reichelt@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 23 Jun 2006 15:59:51 +0000 (15:59 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@114937 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/java2.C [new file with mode: 0644]

index 30c66d3..2f726bd 100644 (file)
@@ -1,3 +1,11 @@
+2006-06-23  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       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   <dannysmith@users.sourceforge.net>
 
        PR target/27789
index 357cba9..c785308 100644 (file)
@@ -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 %<jclass%> undefined");
-
+       {
+         error ("call to Java constructor, while %<jclass%> 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 %<class$%> in %qT", type);
+       return error_mark_node;
+      }
+  }
 
   class_decl = IDENTIFIER_GLOBAL_VALUE (name);
   if (class_decl == NULL_TREE)
index b9204ec..3b3dc6b 100644 (file)
@@ -1,3 +1,8 @@
+2006-06-23  Volker Reichelt  <reichelt@igpm.rwth-aachen.de>
+
+       PR c++/11468
+       * g++.dg/other/java2.C: New test.
+
 2006-06-23  Danny Smith   <dannysmith@users.sourceforge.net>
 
        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 (file)
index 0000000..8ba4d5a
--- /dev/null
@@ -0,0 +1,11 @@
+// PR c++/???
+// { dg-do compile }
+
+extern "Java"
+{
+  struct A {};
+}
+
+typedef void* jclass;
+
+A* p = new A;  // { dg-error "class\\$" }