OSDN Git Service

PR c++/46472
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Feb 2011 23:18:01 +0000 (23:18 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 20 Feb 2011 23:18:01 +0000 (23:18 +0000)
* method.c (process_subob_fn): Instantiate constexpr templates.
* optimize.c (maybe_clone_body): Propagate DECL_DECLARED_CONSTEXPR_P.

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

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 a40fd02..b867ef3 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 bfe8a06..47f1808 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 b00bc28..ed59f91 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 7078fdb..9eff5ff 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;