diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ae75f8fc23f..4abda48a89d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2005-02-22 Mark Mitchell + + PR c++/19883 + * parser.c (cp_parser_direct_declarator): Always complain about + non-constant array bounds when in a function scope. + * semantics.c (finish_id_expression): Do not mark dependent names + as non-constant. + 2005-02-21 Douglas Gregor PR c++/19076 diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index f38f6fbc78f..b52ba9595e2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -11107,15 +11107,8 @@ cp_parser_direct_declarator (cp_parser* parser, bounds = fold_non_dependent_expr (bounds); /* Normally, the array bound must be an integral constant expression. However, as an extension, we allow VLAs - in function scopes. And, we allow type-dependent - expressions in templates; sometimes we don't know for - sure whether or not something is a valid integral - constant expression until instantiation time. (It - doesn't make sense to check for value-dependency, as - an expression is only value-dependent when it is a - constant expression.) */ - else if (!type_dependent_expression_p (bounds) - && !at_function_scope_p ()) + in function scopes. */ + else if (!at_function_scope_p ()) { error ("array bound is not an integer constant"); bounds = error_mark_node; diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index fcffb3ddfa6..4ff333b3aad 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2629,11 +2629,6 @@ finish_id_expression (tree id_expression, need. */ if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR) return id_expression; - /* Since this name was dependent, the expression isn't - constant -- yet. No error is issued because it might be - constant when things are instantiated. */ - if (integral_constant_expression_p) - *non_integral_constant_expression_p = true; *idk = CP_ID_KIND_UNQUALIFIED_DEPENDENT; /* If we found a variable, then name lookup during the instantiation will always resolve to the same VAR_DECL diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e8661bf0d9e..86857d2aa20 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-02-22 Mark Mitchell + + PR c++/19883 + * g++.dg/parse/constant6.C: New test. + 2005-02-22 Uros Bizjak * g++.dg/charset/asm1.c: Check for IBM1047 code set, not IBM-1047. diff --git a/gcc/testsuite/g++.dg/parse/constant6.C b/gcc/testsuite/g++.dg/parse/constant6.C new file mode 100644 index 00000000000..dae01d47be3 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/constant6.C @@ -0,0 +1,23 @@ +// PR c++/19883 + +template struct A +{ + static const T i = 1; + char a[int(i)]; +}; + +template struct B {}; + +template struct C +{ + static const T i = 2; + B a; +}; + +template< typename T, T N > +struct integral_c +{ + static const T value = N; + + typedef integral_c< T, static_cast((value + 1)) > next; +};