OSDN Git Service

/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Sep 2007 18:38:49 +0000 (18:38 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 Sep 2007 18:38:49 +0000 (18:38 +0000)
2007-09-06  Paolo Carlini  <pcarlini@suse.de>

PR c++/32674
* decl.c (cp_finish_decl): When processing_template_decl,
deal correctly with init as TREE_LIST.

/testsuite
2007-09-06  Paolo Carlini  <pcarlini@suse.de>

PR c++/32674
* g++.dg/template/static31.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@128201 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/static31.C [new file with mode: 0644]

index db8b3eb..2c3533d 100644 (file)
@@ -1,3 +1,9 @@
+2007-09-06  Paolo Carlini  <pcarlini@suse.de>
+
+       PR c++/32674
+       * decl.c (cp_finish_decl): When processing_template_decl,
+       deal correctly with init as TREE_LIST.
+
 2007-09-06  Tom Tromey  <tromey@redhat.com>
 
        * decl.c (finish_function): Put return's location on line zero of
index 86f2a4a..271b8e6 100644 (file)
@@ -5333,7 +5333,21 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
          goto finish_end;
        }
 
-      init = fold_non_dependent_expr (init);
+      if (TREE_CODE (init) == TREE_LIST)
+       {
+         /* If the parenthesized-initializer form was used (e.g.,
+            "int A<N>::i(X)"), then INIT will be a TREE_LIST of initializer
+            arguments.  (There is generally only one.)  We convert them
+            individually.  */
+         tree list = init;
+         for (; list; list = TREE_CHAIN (list))
+           {
+             tree elt = TREE_VALUE (list);
+             TREE_VALUE (list) = fold_non_dependent_expr (elt);
+           }
+       }
+      else
+       init = fold_non_dependent_expr (init);
       processing_template_decl = 0;
     }
 
index 12fa069..de450f6 100644 (file)
@@ -1,3 +1,8 @@
+2007-09-06  Paolo Carlini  <pcarlini@suse.de>
+
+       PR c++/32674
+       * g++.dg/template/static31.C: New.
+
 2007-09-06  Francois-Xavier Coudert  <fxcoudert@gcc.gnu.org>
 
        PR fortran/33271
diff --git a/gcc/testsuite/g++.dg/template/static31.C b/gcc/testsuite/g++.dg/template/static31.C
new file mode 100644 (file)
index 0000000..935a8a7
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/32674
+
+class C
+{
+  static const int j = 3;
+};
+
+template<int> class A
+{
+  static const int i1;
+  static const int i2;
+  static const int i3;
+  static const int i4;
+};
+
+template<int N> const int A<N>::i1(C::j);
+template<int N> const int A<N>::i2 = C::j;
+template<int N> const int A<N>::i3(C::j, 5); // { dg-error "compound expression" }
+template<int N> const int A<N>::i4 = (C::j, 7);