parser.c (cp_parser_direct_declarator): Always complain about non-constant array bounds when in a function scope.
* 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. From-SVN: r95417
This commit is contained in:
parent
245b65adcc
commit
b671e5a499
@ -1,3 +1,11 @@
|
||||
2005-02-22 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
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 <dgregor@cs.indiana.edu>
|
||||
|
||||
PR c++/19076
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -1,3 +1,8 @@
|
||||
2005-02-22 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/19883
|
||||
* g++.dg/parse/constant6.C: New test.
|
||||
|
||||
2005-02-22 Uros Bizjak <uros@kss-loka.si>
|
||||
|
||||
* g++.dg/charset/asm1.c: Check for IBM1047 code set, not IBM-1047.
|
||||
|
23
gcc/testsuite/g++.dg/parse/constant6.C
Normal file
23
gcc/testsuite/g++.dg/parse/constant6.C
Normal file
@ -0,0 +1,23 @@
|
||||
// PR c++/19883
|
||||
|
||||
template<typename T> struct A
|
||||
{
|
||||
static const T i = 1;
|
||||
char a[int(i)];
|
||||
};
|
||||
|
||||
template<int> struct B {};
|
||||
|
||||
template<typename T> struct C
|
||||
{
|
||||
static const T i = 2;
|
||||
B<int(i)> a;
|
||||
};
|
||||
|
||||
template< typename T, T N >
|
||||
struct integral_c
|
||||
{
|
||||
static const T value = N;
|
||||
|
||||
typedef integral_c< T, static_cast<T>((value + 1)) > next;
|
||||
};
|
Loading…
Reference in New Issue
Block a user