non-constant array bounds when in a function scope.
* semantics.c (finish_id_expression): Do not mark dependent names
as non-constant.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@95417
138bc75d-0d04-0410-961f-
82ee72b054a4
+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
2005-02-21 Douglas Gregor <dgregor@cs.indiana.edu>
PR c++/19076
bounds = fold_non_dependent_expr (bounds);
/* Normally, the array bound must be an integral constant
expression. However, as an extension, we allow VLAs
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;
{
error ("array bound is not an integer constant");
bounds = error_mark_node;
need. */
if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR)
return 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
*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
+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.
2005-02-22 Uros Bizjak <uros@kss-loka.si>
* g++.dg/charset/asm1.c: Check for IBM1047 code set, not IBM-1047.
--- /dev/null
+// 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;
+};