re PR c++/55003 ([C++11] Member function pointer not working as constexpr initializer)
authorJason Merrill <jason@redhat.com>
Fri, 15 Feb 2013 01:27:36 +0000 (20:27 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Fri, 15 Feb 2013 01:27:36 +0000 (20:27 -0500)
PR c++/55003
* decl.c (cp_finish_decl): Force instantiation of an
auto static data member.

From-SVN: r196069

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

index 1ecbb7b..1e658e9 100644 (file)
@@ -1,5 +1,9 @@
 2013-02-14  Jason Merrill  <jason@redhat.com>
 
+       PR c++/55003
+       * decl.c (cp_finish_decl): Force instantiation of an
+       auto static data member.
+
        PR c++/55220
        * pt.c (unify): A pack expansion that is not the last template
        argument makes the entire template argument list non-deduced.
index eb6c490..3d63389 100644 (file)
@@ -6111,6 +6111,15 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p,
       tree d_init;
       if (init == NULL_TREE)
        {
+         if (DECL_TEMPLATE_INSTANTIATION (decl)
+             && !DECL_TEMPLATE_INSTANTIATED (decl))
+           {
+             /* init is null because we're deferring instantiating the
+                initializer until we need it.  Well, we need it now.  */
+             instantiate_decl (decl, /*defer_ok*/true, /*expl*/false);
+             return;
+           }
+
          error ("declaration of %q#D has no initializer", decl);
          TREE_TYPE (decl) = error_mark_node;
          return;
diff --git a/gcc/testsuite/g++.dg/cpp0x/auto37.C b/gcc/testsuite/g++.dg/cpp0x/auto37.C
new file mode 100644 (file)
index 0000000..f4b2904
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/55003
+// { dg-do compile { target c++11 } }
+
+template<typename T>
+struct A {
+  static const auto t
+    = (typename T::type)42;
+};
+
+struct X {
+  typedef int type;
+};
+
+A<X> a;