From dd125026935bd067c6da488d7faf94b180f1c861 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 18 Mar 2016 08:59:36 +0100 Subject: [PATCH] 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 --- gcc/cp/ChangeLog | 6 +++++ gcc/cp/init.c | 8 +++++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/ext/java-3.C | 39 +++++++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 gcc/testsuite/g++.dg/ext/java-3.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7e3ceeb5d29..75530b6dc30 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2016-03-18 Jakub Jelinek + + 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 PR c++/70205 diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 1ba3c59c90e..22c039bc16d 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -2872,6 +2872,14 @@ build_new_1 (vec **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 b56c9bf7351..7209e5b49f8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-03-18 Jakub Jelinek + + PR c++/70267 + * g++.dg/ext/java-3.C: New test. + 2016-03-18 Patrick Palka 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 00000000000..45b2486dbd2 --- /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); +} -- 2.30.2