aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2016-03-18 08:59:36 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2016-03-18 08:59:36 +0100
commitdd125026935bd067c6da488d7faf94b180f1c861 (patch)
treefb0e73835cbc0916a270daeab7ffa6fe5562eb76 /gcc
parenta065dbc9f62bdeccc83e18e03da0384f45632b1e (diff)
downloadgcc-dd125026935bd067c6da488d7faf94b180f1c861.zip
gcc-dd125026935bd067c6da488d7faf94b180f1c861.tar.gz
gcc-dd125026935bd067c6da488d7faf94b180f1c861.tar.bz2
re PR c++/70267 (ICE on invalid code at -O1 and above on x86_64-linux-gnu in propagate_necessity, at tree-ssa-dce.c:924)
PR c++/70267 * init.c (build_new_1): Complain and return error_mark_node if alloc_fn is not _Jv_AllocObject function returning pointer. * g++.dg/ext/java-3.C: New test. From-SVN: r234319
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/init.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ext/java-3.C39
4 files changed, 58 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7e3ceeb..75530b6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2016-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70267
+ * init.c (build_new_1): Complain and return error_mark_node
+ if alloc_fn is not _Jv_AllocObject function returning pointer.
+
2016-03-18 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/70205
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 1ba3c59..22c039b 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -2872,6 +2872,14 @@ build_new_1 (vec<tree, va_gc> **placement, tree type, tree nelts,
return error_mark_node;
}
alloc_fn = OVL_CURRENT (alloc_fn);
+ if (TREE_CODE (alloc_fn) != FUNCTION_DECL
+ || TREE_CODE (TREE_TYPE (alloc_fn)) != FUNCTION_TYPE
+ || !POINTER_TYPE_P (TREE_TYPE (TREE_TYPE (alloc_fn))))
+ {
+ if (complain & tf_error)
+ error ("%qD is not a function returning a pointer", alloc_fn);
+ return error_mark_node;
+ }
class_addr = build1 (ADDR_EXPR, jclass_node, class_decl);
alloc_call = cp_build_function_call_nary (alloc_fn, complain,
class_addr, NULL_TREE);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b56c9bf..7209e5b 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-03-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR c++/70267
+ * g++.dg/ext/java-3.C: New test.
+
2016-03-18 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/70205
diff --git a/gcc/testsuite/g++.dg/ext/java-3.C b/gcc/testsuite/g++.dg/ext/java-3.C
new file mode 100644
index 0000000..45b2486
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/java-3.C
@@ -0,0 +1,39 @@
+// PR c++/70267
+// { dg-do compile }
+// { dg-options "-O2" }
+
+extern "Java"
+{
+ typedef __java_int jint;
+ namespace java
+ {
+ namespace lang
+ {
+ class Class;
+ class Object;
+ class Throwable {};
+ class Foo;
+ }
+ }
+}
+
+typedef struct java::lang::Object * jobject;
+typedef struct java::lang::Throwable * jthrowable;
+typedef class java::lang::Class * jclass;
+
+using java::lang::Foo;
+
+class Foo: public java::lang::Throwable
+{
+ public:static::java::lang::Class class$;
+};
+
+extern "C" Foo _Jv_AllocObject (jclass);
+extern "C" void _Jv_Throw (jthrowable) __attribute__ ((__noreturn__));
+
+void
+Bar4 (void)
+{
+ Foo * f = new java::lang::Foo; // { dg-error "is not a function returning a pointer" }
+ throw (f);
+}