diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-06-08 18:26:01 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-06-08 18:26:01 +0200 |
commit | 85a988d14eba08447282db312f99637a527bfba0 (patch) | |
tree | 0996b2383b9560e0508fc26e2c0b221bced86d75 /gcc | |
parent | db34470d17bd803cf74f747e7714f6029abd9b38 (diff) | |
download | gcc-85a988d14eba08447282db312f99637a527bfba0.zip gcc-85a988d14eba08447282db312f99637a527bfba0.tar.gz gcc-85a988d14eba08447282db312f99637a527bfba0.tar.bz2 |
re PR c++/40370 (ICE with invalid array bound in template class)
PR c++/40370
PR c++/40372
* parser.c (cp_parser_direct_declarator): Don't set TREE_SIDE_EFFECTS
on error_mark_node. Check for VLAs outside of function context
before check whether to wrap bounds into a NOP_EXPR with
TREE_SIDE_EFFECTS.
* g++.dg/template/error41.C: New test.
* g++.dg/template/error42.C: New test.
From-SVN: r148278
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/cp/parser.c | 13 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/error41.C | 12 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/error42.C | 20 |
5 files changed, 55 insertions, 8 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 12020e8..5c0d473 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,12 @@ +2009-06-08 Jakub Jelinek <jakub@redhat.com> + + PR c++/40370 + PR c++/40372 + * parser.c (cp_parser_direct_declarator): Don't set TREE_SIDE_EFFECTS + on error_mark_node. Check for VLAs outside of function context + before check whether to wrap bounds into a NOP_EXPR with + TREE_SIDE_EFFECTS. + 2009-06-08 Alexandre Oliva <aoliva@redhat.com> * repo.c (get_base_filename): Use aux_base_name rather than diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 00f2580..05ae257 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -13336,13 +13336,6 @@ cp_parser_direct_declarator (cp_parser* parser, &non_constant_p); if (!non_constant_p) bounds = fold_non_dependent_expr (bounds); - else if (processing_template_decl) - { - /* Remember this wasn't a constant-expression. */ - bounds = build_nop (TREE_TYPE (bounds), bounds); - TREE_SIDE_EFFECTS (bounds) = 1; - } - /* Normally, the array bound must be an integral constant expression. However, as an extension, we allow VLAs in function scopes. */ @@ -13352,6 +13345,12 @@ cp_parser_direct_declarator (cp_parser* parser, &token->location); bounds = error_mark_node; } + else if (processing_template_decl && !error_operand_p (bounds)) + { + /* Remember this wasn't a constant-expression. */ + bounds = build_nop (TREE_TYPE (bounds), bounds); + TREE_SIDE_EFFECTS (bounds) = 1; + } } else bounds = NULL_TREE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eec29c7..9c7651d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,13 @@ +2009-06-08 Jakub Jelinek <jakub@redhat.com> + + PR c++/40370 + PR c++/40372 + * g++.dg/template/error41.C: New test. + * g++.dg/template/error42.C: New test. + 2009-06-08 Revital Eres <eres@il.ibm.com> - PR40359 + PR testsuite/40359 * gcc.dg/vect/vect-58.c: Change checks to use vect_hw_misalign. * gcc.dg/vect/vect-88.c: Likewise. * gcc.dg/vect/no-section-anchors-vect-66.c: Likewise. diff --git a/gcc/testsuite/g++.dg/template/error41.C b/gcc/testsuite/g++.dg/template/error41.C new file mode 100644 index 0000000..c92b849 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error41.C @@ -0,0 +1,12 @@ +// PR c++/40370 +// { dg-do compile } + +struct A +{ + static int i; +}; + +template <int> struct B +{ + int x[A::i]; // { dg-error "array bound is not an integer constant" } +}; diff --git a/gcc/testsuite/g++.dg/template/error42.C b/gcc/testsuite/g++.dg/template/error42.C new file mode 100644 index 0000000..0d651e3 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/error42.C @@ -0,0 +1,20 @@ +// PR c++/40372 +// { dg-do compile } + +template <int> struct A +{ + int i; // { dg-error "invalid use of non-static data member" } + friend void foo () + { + int x[i]; // { dg-error "from this location" } + } +}; + +struct B +{ + int j; // { dg-error "invalid use of non-static data member" } + friend int bar () + { + return j; // { dg-error "from this location" } + } +}; |