From f19218e50496219b72a5c7ddb62fca4df8980343 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Fri, 13 Oct 2006 04:09:41 +0000 Subject: [PATCH] re PR c++/29318 (ICE: type_info of pointer to VLA) PR c++/29318 * rtti.c (get_tinfo_decl): Refuse to create type info objects for variably modified types. PR c++/29318 * g++.dg/ext/vla4.C: New test. From-SVN: r117683 --- gcc/cp/ChangeLog | 6 ++++++ gcc/cp/rtti.c | 5 ++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/ext/vla4.C | 21 +++++++++++++++++++++ 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/g++.dg/ext/vla4.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4102503dea8..18958d46bab 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-10-12 Mark Mitchell + + PR c++/29318 + * rtti.c (get_tinfo_decl): Refuse to create type info objects for + variably modified types. + 2006-10-12 Lee Millward PR c++/27961 diff --git a/gcc/cp/rtti.c b/gcc/cp/rtti.c index b4cede48b06..0cb825dd199 100644 --- a/gcc/cp/rtti.c +++ b/gcc/cp/rtti.c @@ -342,11 +342,10 @@ get_tinfo_decl (tree type) tree name; tree d; - if (COMPLETE_TYPE_P (type) - && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST) + if (variably_modified_type_p (type, /*fn=*/NULL_TREE)) { error ("cannot create type information for type %qT because " - "its size is variable", + "it involves types of variable size", type); return error_mark_node; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ce07d43a4f1..7952579c81d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-10-12 Mark Mitchell + + PR c++/29318 + * g++.dg/ext/vla4.C: New test. + 2006-10-12 Lee Millward PR c++/27961 diff --git a/gcc/testsuite/g++.dg/ext/vla4.C b/gcc/testsuite/g++.dg/ext/vla4.C new file mode 100644 index 00000000000..8b7f38f8ba8 --- /dev/null +++ b/gcc/testsuite/g++.dg/ext/vla4.C @@ -0,0 +1,21 @@ +// PR c++/29318 +// { dg-options "" } + +#include + +void f(int i) { + try { + int a[i]; + throw &a; // { dg-error "variable size" } + } catch (int (&)[i]) { // { dg-error "variable size" } + } +} + +int main() +{ + int i = 5; + int va[i]; + const std::type_info& info(typeid(&va)); // { dg-error "variable size" } + + return 0; +} -- 2.30.2