]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
cp-tree.h (DECL_TEMPLOID_INSTANTIATION): New.
authorJason Merrill <jason@redhat.com>
Tue, 20 Sep 2011 19:38:06 +0000 (15:38 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 20 Sep 2011 19:38:06 +0000 (15:38 -0400)
* cp-tree.h (DECL_TEMPLOID_INSTANTIATION): New.
(DECL_GENERATED_P): New.
* class.c (finalize_literal_type_property): Use them.
* semantics.c (is_instantiation_of_constexpr): Likewise.
(register_constexpr_fundef): Likewise.

From-SVN: r179017

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C [new file with mode: 0644]

index da3f491c66ebe4a3b89eefb440467f7e42c1c956..c9c4a215f70079405c5aa9eccc6c8ab618c4d888 100644 (file)
@@ -1,5 +1,11 @@
 2011-09-20  Jason Merrill  <jason@redhat.com>
 
+       * cp-tree.h (DECL_TEMPLOID_INSTANTIATION): New.
+       (DECL_GENERATED_P): New.
+       * class.c (finalize_literal_type_property): Use them.
+       * semantics.c (is_instantiation_of_constexpr): Likewise.
+       (register_constexpr_fundef): Likewise.
+
        * call.c (convert_default_arg): Avoid redundant copy.
        * tree.c (bot_manip): Copy everything.
 
index a4a7468bad1cb74edaaf264c25549ac597d63503..e39841680327b8a051cda69ed6925d23d66b6732 100644 (file)
@@ -4581,7 +4581,7 @@ finalize_literal_type_property (tree t)
          && !DECL_CONSTRUCTOR_P (fn))
        {
          DECL_DECLARED_CONSTEXPR_P (fn) = false;
-         if (!DECL_TEMPLATE_INFO (fn))
+         if (!DECL_GENERATED_P (fn))
            {
              error ("enclosing class of constexpr non-static member "
                     "function %q+#D is not a literal type", fn);
index 8e52e282a3bb16ae0382f0bcaac7663175d25104..bcfc3b3be0fa21699332ee2f95a9f8e34ad3d4fc 100644 (file)
@@ -3705,6 +3705,17 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
 #define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
   (DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (DECL))
 
+/* Nonzero if DECL is a function generated from a function 'temploid',
+   i.e. template, member of class template, or dependent friend.  */
+#define DECL_TEMPLOID_INSTANTIATION(DECL)              \
+  (DECL_TEMPLATE_INSTANTIATION (DECL)                  \
+   || DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (DECL))
+
+/* Nonzero if DECL is either defined implicitly by the compiler or
+   generated from a temploid.  */
+#define DECL_GENERATED_P(DECL) \
+  (DECL_TEMPLOID_INSTANTIATION (DECL) || DECL_DEFAULTED_FN (DECL))
+
 /* Nonzero iff we are currently processing a declaration for an
    entity with its own template parameter list, and which is not a
    full specialization.  */
index f782df9ec36c7bdd022fdbe1a2c96796063bbd2f..150805f7e8108ac301eabb328d6e6bdff3056b12 100644 (file)
@@ -3559,7 +3559,7 @@ emit_associated_thunks (tree fn)
 static inline bool
 is_instantiation_of_constexpr (tree fun)
 {
-  return (DECL_TEMPLATE_INFO (fun)
+  return (DECL_TEMPLOID_INSTANTIATION (fun)
          && DECL_DECLARED_CONSTEXPR_P (DECL_TEMPLATE_RESULT
                                        (DECL_TI_TEMPLATE (fun))));
 }
@@ -5820,7 +5820,7 @@ register_constexpr_fundef (tree fun, tree body)
   constexpr_fundef entry;
   constexpr_fundef **slot;
 
-  if (!is_valid_constexpr_fn (fun, !DECL_TEMPLATE_INFO (fun)))
+  if (!is_valid_constexpr_fn (fun, !DECL_GENERATED_P (fun)))
     return NULL;
 
   body = massage_constexpr_body (fun, body);
@@ -5833,13 +5833,13 @@ register_constexpr_fundef (tree fun, tree body)
 
   if (!potential_rvalue_constant_expression (body))
     {
-      if (!DECL_TEMPLATE_INFO (fun))
+      if (!DECL_GENERATED_P (fun))
        require_potential_rvalue_constant_expression (body);
       return NULL;
     }
 
   if (DECL_CONSTRUCTOR_P (fun)
-      && cx_check_missing_mem_inits (fun, body, !DECL_TEMPLATE_INFO (fun)))
+      && cx_check_missing_mem_inits (fun, body, !DECL_GENERATED_P (fun)))
     return NULL;
 
   /* Create the constexpr function table if necessary.  */
index 85a4acbf98822949228c20541e4b489db2aec239..fa9a80ca69891c990d77910223191358fe73b7cc 100644 (file)
@@ -1,5 +1,7 @@
 2011-09-20  Jason Merrill  <jason@redhat.com>
 
+       * g++.dg/cpp0x/constexpr-generated1.C: New.
+
        PR c++/50442
        * g++.dg/overload/ref-conv1.C: New.
 
diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-generated1.C
new file mode 100644 (file)
index 0000000..73ddc8f
--- /dev/null
@@ -0,0 +1,21 @@
+// { dg-options -std=c++0x }
+
+template <class T> struct A
+{
+  constexpr T f ();
+};
+
+int g();
+
+// We should complain about this.
+template<> constexpr int A<int>::f()
+{ return g(); }                        // { dg-error "non-constexpr" }
+
+// But not about this.
+struct B
+{
+  int i;
+  constexpr B(int i = g()):i(i) { }
+};
+struct C: B { };
+C c;