OSDN Git Service

* parser.c (cp_parser_direct_declarator): Always complain about
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Feb 2005 21:43:55 +0000 (21:43 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 22 Feb 2005 21:43:55 +0000 (21:43 +0000)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/constant6.C [new file with mode: 0644]

index ae75f8f..4abda48 100644 (file)
@@ -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
index f38f6fb..b52ba95 100644 (file)
@@ -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;
index fcffb3d..4ff333b 100644 (file)
@@ -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
index e8661bf..86857d2 100644 (file)
@@ -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.
diff --git a/gcc/testsuite/g++.dg/parse/constant6.C b/gcc/testsuite/g++.dg/parse/constant6.C
new file mode 100644 (file)
index 0000000..dae01d4
--- /dev/null
@@ -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;
+};