* 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
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.
&& !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);
#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. */
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))));
}
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);
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. */
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.
--- /dev/null
+// { 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;