re PR c++/9335 (repeated diagnostic when maximum template depth is exceeded)

PR c++/9335
gcc/cp:
	* init.c (constant_value_1): Treat error_mark_node as a constant
	if DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P is set.
	* cvt.c (ocp_convert): Handle getting error_mark_node from
	integral_constant_value.
	* decl.c (compute_array_index_type): Likewise.
gcc/testsuite:
	* lib/prune.exp: Prune "skipping N instantiation contexts".

From-SVN: r158586
This commit is contained in:
Jason Merrill 2010-04-21 02:06:27 -04:00 committed by Jason Merrill
parent 4811db8d42
commit 88274c4d22
10 changed files with 41 additions and 4 deletions

View File

@ -1,3 +1,12 @@
2010-04-20 Jason Merrill <jason@redhat.com>
PR c++/9335
* init.c (constant_value_1): Treat error_mark_node as a constant
if DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P is set.
* cvt.c (ocp_convert): Handle getting error_mark_node from
integral_constant_value.
* decl.c (compute_array_index_type): Likewise.
2010-04-20 Dodji Seketeli <dodji@redhat.com>
PR c++/43800

View File

@ -610,6 +610,8 @@ ocp_convert (tree type, tree expr, int convtype, int flags)
}
e = integral_constant_value (e);
if (error_operand_p (e))
return error_mark_node;
if (MAYBE_CLASS_TYPE_P (type) && (convtype & CONV_FORCE_TEMP))
/* We need a new temporary; don't take this shortcut. */;

View File

@ -7319,6 +7319,8 @@ compute_array_index_type (tree name, tree size)
/* It might be a const variable or enumeration constant. */
size = integral_constant_value (size);
if (error_operand_p (size))
return error_mark_node;
/* Normally, the array-bound will be a constant. */
if (TREE_CODE (size) == INTEGER_CST)

View File

@ -1658,7 +1658,14 @@ constant_value_1 (tree decl, bool integral_p)
init = DECL_INITIAL (decl);
}
if (init == error_mark_node)
return decl;
{
if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
/* Treat the error as a constant to avoid cascading errors on
excessively recursive template instantiation (c++/9335). */
return init;
else
return decl;
}
/* Initializers in templates are generally expanded during
instantiation, so before that for const int i(2)
INIT is a TREE_LIST with the actual initializer as

View File

@ -1,3 +1,12 @@
2010-04-20 Jason Merrill <jason@redhat.com>
PR c++/9335
* g++.dg/template/recurse2.C: New.
* g++.dg/parse/crash36.C: Adjust.
* g++.dg/other/fold1.C: Adjust.
* g++.dg/init/member1.C: Adjust.
* lib/prune.exp: Prune "skipping N instantiation contexts".
2010-04-20 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* gcc.dg/torture/builtin-cproj-1.c: Test more cases.

View File

@ -11,7 +11,7 @@ template<int> struct B {};
template<typename T> struct C
{
static const int i = A<T>::i; // { dg-error "incomplete" }
static const int j = i; // { dg-error "non-constant expression" }
static const int j = i;
B<j> b; // { dg-error "not a valid template arg" }
};

View File

@ -4,5 +4,5 @@
struct A
{
static const int i = i; // { dg-error "not declared" }
int x[i]; // { dg-error "integral constant-expression" }
int x[i];
};

View File

@ -9,4 +9,4 @@ template <typename... T> struct A // { dg-warning "variadic templates" }
static const int i = sizeof (++t); // { dg-error "was not declared in this scope" }
};
int x[A <int>::i]; // { dg-error "is not an integral constant-expression" }
int x[A <int>::i];

View File

@ -0,0 +1,7 @@
// PR c++/9335
// We should not see an error about non-constant initialization.
template <int N> struct X {
static const int value = X<N-1>::value; // { dg-error "instantiation|incomplete" }
};
template struct X<1000>;

View File

@ -23,6 +23,7 @@ proc prune_gcc_output { text } {
regsub -all "(^|\n)(\[^\n\]*: )?In ((static member |lambda )?function|member|method|(copy )?constructor|destructor|instantiation|program|subroutine|block-data)\[^\n\]*" $text "" text
regsub -all "(^|\n)\[^\n\]*(: )?At (top level|global scope):\[^\n\]*" $text "" text
regsub -all "(^|\n)\[^\n\]*: instantiated from \[^\n\]*" $text "" text
regsub -all "(^|\n)\[^\n\]*: . skipping \[0-9\]* instantiation contexts \[^\n\]*" $text "" text
regsub -all "(^|\n) inlined from \[^\n\]*" $text "" text
regsub -all "(^|\n)collect2: ld returned \[^\n\]*" $text "" text
regsub -all "(^|\n)collect: re(compiling|linking)\[^\n\]*" $text "" text