Commit b671e5a4 by Mark Mitchell Committed by Mark Mitchell

parser.c (cp_parser_direct_declarator): Always complain about non-constant array…

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
parent 245b65ad
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> 2005-02-21 Douglas Gregor <dgregor@cs.indiana.edu>
PR c++/19076 PR c++/19076
......
...@@ -11107,15 +11107,8 @@ cp_parser_direct_declarator (cp_parser* parser, ...@@ -11107,15 +11107,8 @@ cp_parser_direct_declarator (cp_parser* parser,
bounds = fold_non_dependent_expr (bounds); bounds = fold_non_dependent_expr (bounds);
/* 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. And, we allow type-dependent in function scopes. */
expressions in templates; sometimes we don't know for else if (!at_function_scope_p ())
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 ())
{ {
error ("array bound is not an integer constant"); error ("array bound is not an integer constant");
bounds = error_mark_node; bounds = error_mark_node;
......
...@@ -2629,11 +2629,6 @@ finish_id_expression (tree id_expression, ...@@ -2629,11 +2629,6 @@ finish_id_expression (tree id_expression,
need. */ need. */
if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR) if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR)
return id_expression; 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; *idk = CP_ID_KIND_UNQUALIFIED_DEPENDENT;
/* If we found a variable, then name lookup during the /* If we found a variable, then name lookup during the
instantiation will always resolve to the same VAR_DECL instantiation will always resolve to the same VAR_DECL
......
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> 2005-02-22 Uros Bizjak <uros@kss-loka.si>
* g++.dg/charset/asm1.c: Check for IBM1047 code set, not IBM-1047. * g++.dg/charset/asm1.c: Check for IBM1047 code set, not IBM-1047.
......
// 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;
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment