diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-03-18 08:59:36 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-03-18 08:59:36 +0100 |
commit | dd125026935bd067c6da488d7faf94b180f1c861 (patch) | |
tree | fb0e73835cbc0916a270daeab7ffa6fe5562eb76 /gcc | |
parent | a065dbc9f62bdeccc83e18e03da0384f45632b1e (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/ext/java-3.C | 39 |
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); +} |