re PR c++/46472 ([C++0X] constexpr is not constexpr)
authorJason Merrill <jason@redhat.com>
Sun, 20 Feb 2011 23:18:01 +0000 (18:18 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Sun, 20 Feb 2011 23:18:01 +0000 (18:18 -0500)
PR c++/46472
* method.c (process_subob_fn): Instantiate constexpr templates.
* optimize.c (maybe_clone_body): Propagate DECL_DECLARED_CONSTEXPR_P.

From-SVN: r170348

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/cp/optimize.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C [new file with mode: 0644]

index a40fd02141bc7f1d52f191e0b2047682dd97a532..b867ef327bc92052fbfe857c21355658aa31280d 100644 (file)
@@ -1,3 +1,9 @@
+2011-02-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/46472
+       * method.c (process_subob_fn): Instantiate constexpr templates.
+       * optimize.c (maybe_clone_body): Propagate DECL_DECLARED_CONSTEXPR_P.
+
 2011-02-20  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/46394
index bfe8a067a8b551051d7b5ab0a39a48bcd975f6c4..47f18081063c72a22e7842c714e169de6e4a276b 100644 (file)
@@ -941,8 +941,17 @@ process_subob_fn (tree fn, bool move_p, tree *spec_p, bool *trivial_p,
       goto bad;
     }
 
-  if (constexpr_p && !DECL_DECLARED_CONSTEXPR_P (fn))
-    *constexpr_p = false;
+  if (constexpr_p)
+    {
+      /* If this is a specialization of a constexpr template, we need to
+        force the instantiation now so that we know whether or not it's
+        really constexpr.  */
+      if (DECL_DECLARED_CONSTEXPR_P (fn) && DECL_TEMPLATE_INSTANTIATION (fn)
+         && !DECL_TEMPLATE_INSTANTIATED (fn))
+       instantiate_decl (fn, /*defer_ok*/false, /*expl_class*/false);
+      if (!DECL_DECLARED_CONSTEXPR_P (fn))
+       *constexpr_p = false;
+    }
 
   return;
 
index b00bc28f030b3f7c9741a01efc3c44357310d9b3..ed59f91eff34c65ac43c91f77101c52a9f0ddc42 100644 (file)
@@ -256,6 +256,7 @@ maybe_clone_body (tree fn)
       /* Update CLONE's source position information to match FN's.  */
       DECL_SOURCE_LOCATION (clone) = DECL_SOURCE_LOCATION (fn);
       DECL_DECLARED_INLINE_P (clone) = DECL_DECLARED_INLINE_P (fn);
+      DECL_DECLARED_CONSTEXPR_P (clone) = DECL_DECLARED_CONSTEXPR_P (fn);
       DECL_COMDAT (clone) = DECL_COMDAT (fn);
       DECL_WEAK (clone) = DECL_WEAK (fn);
 
index 7078fdbb85f7bb569e939bcd26f8ff836031eff4..9eff5ffcd2f530c5632d05a706dbc657c198558f 100644 (file)
@@ -1,3 +1,7 @@
+2011-02-20  Jason Merrill  <jason@redhat.com>
+
+       * g++.dg/cpp0x/constexpr-synth1.C: New.
+
 2011-02-20  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc.dg/layout-2.m: New.
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-synth1.C
new file mode 100644 (file)
index 0000000..9830939
--- /dev/null
@@ -0,0 +1,14 @@
+// PR c++/46472
+// { dg-options -std=c++0x }
+
+template<class T> struct A {
+  T t;
+  constexpr A(){}
+};
+
+struct B
+{
+  A<int> a;
+};
+
+B b;