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
This commit is contained in:
Jakub Jelinek 2009-06-08 18:26:01 +02:00
parent db34470d17
commit 85a988d14e
5 changed files with 55 additions and 8 deletions

View File

@ -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> 2009-06-08 Alexandre Oliva <aoliva@redhat.com>
* repo.c (get_base_filename): Use aux_base_name rather than * repo.c (get_base_filename): Use aux_base_name rather than

View File

@ -13336,13 +13336,6 @@ cp_parser_direct_declarator (cp_parser* parser,
&non_constant_p); &non_constant_p);
if (!non_constant_p) if (!non_constant_p)
bounds = fold_non_dependent_expr (bounds); 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 /* Normally, the array bound must be an integral constant
expression. However, as an extension, we allow VLAs expression. However, as an extension, we allow VLAs
in function scopes. */ in function scopes. */
@ -13352,6 +13345,12 @@ cp_parser_direct_declarator (cp_parser* parser,
&token->location); &token->location);
bounds = error_mark_node; 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 else
bounds = NULL_TREE; bounds = NULL_TREE;

View File

@ -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> 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-58.c: Change checks to use vect_hw_misalign.
* gcc.dg/vect/vect-88.c: Likewise. * gcc.dg/vect/vect-88.c: Likewise.
* gcc.dg/vect/no-section-anchors-vect-66.c: Likewise. * gcc.dg/vect/no-section-anchors-vect-66.c: Likewise.

View File

@ -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" }
};

View File

@ -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" }
}
};