Commit b432106b by Jason Merrill Committed by Jason Merrill

cp-tree.h (DECL_TEMPLOID_INSTANTIATION): New.

	* 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
parent a4d25b44
2011-09-20 Jason Merrill <jason@redhat.com> 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. * call.c (convert_default_arg): Avoid redundant copy.
* tree.c (bot_manip): Copy everything. * tree.c (bot_manip): Copy everything.
......
...@@ -4581,7 +4581,7 @@ finalize_literal_type_property (tree t) ...@@ -4581,7 +4581,7 @@ finalize_literal_type_property (tree t)
&& !DECL_CONSTRUCTOR_P (fn)) && !DECL_CONSTRUCTOR_P (fn))
{ {
DECL_DECLARED_CONSTEXPR_P (fn) = false; DECL_DECLARED_CONSTEXPR_P (fn) = false;
if (!DECL_TEMPLATE_INFO (fn)) if (!DECL_GENERATED_P (fn))
{ {
error ("enclosing class of constexpr non-static member " error ("enclosing class of constexpr non-static member "
"function %q+#D is not a literal type", fn); "function %q+#D is not a literal type", fn);
......
...@@ -3705,6 +3705,17 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter) ...@@ -3705,6 +3705,17 @@ more_aggr_init_expr_args_p (const aggr_init_expr_arg_iterator *iter)
#define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \ #define DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION(DECL) \
(DECL_TEMPLATE_INFO (DECL) && !DECL_USE_TEMPLATE (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 /* Nonzero iff we are currently processing a declaration for an
entity with its own template parameter list, and which is not a entity with its own template parameter list, and which is not a
full specialization. */ full specialization. */
......
...@@ -3559,7 +3559,7 @@ emit_associated_thunks (tree fn) ...@@ -3559,7 +3559,7 @@ emit_associated_thunks (tree fn)
static inline bool static inline bool
is_instantiation_of_constexpr (tree fun) is_instantiation_of_constexpr (tree fun)
{ {
return (DECL_TEMPLATE_INFO (fun) return (DECL_TEMPLOID_INSTANTIATION (fun)
&& DECL_DECLARED_CONSTEXPR_P (DECL_TEMPLATE_RESULT && DECL_DECLARED_CONSTEXPR_P (DECL_TEMPLATE_RESULT
(DECL_TI_TEMPLATE (fun)))); (DECL_TI_TEMPLATE (fun))));
} }
...@@ -5820,7 +5820,7 @@ register_constexpr_fundef (tree fun, tree body) ...@@ -5820,7 +5820,7 @@ register_constexpr_fundef (tree fun, tree body)
constexpr_fundef entry; constexpr_fundef entry;
constexpr_fundef **slot; 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; return NULL;
body = massage_constexpr_body (fun, body); body = massage_constexpr_body (fun, body);
...@@ -5833,13 +5833,13 @@ register_constexpr_fundef (tree fun, tree body) ...@@ -5833,13 +5833,13 @@ register_constexpr_fundef (tree fun, tree body)
if (!potential_rvalue_constant_expression (body)) if (!potential_rvalue_constant_expression (body))
{ {
if (!DECL_TEMPLATE_INFO (fun)) if (!DECL_GENERATED_P (fun))
require_potential_rvalue_constant_expression (body); require_potential_rvalue_constant_expression (body);
return NULL; return NULL;
} }
if (DECL_CONSTRUCTOR_P (fun) 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; return NULL;
/* Create the constexpr function table if necessary. */ /* Create the constexpr function table if necessary. */
......
2011-09-20 Jason Merrill <jason@redhat.com> 2011-09-20 Jason Merrill <jason@redhat.com>
* g++.dg/cpp0x/constexpr-generated1.C: New.
PR c++/50442 PR c++/50442
* g++.dg/overload/ref-conv1.C: New. * g++.dg/overload/ref-conv1.C: New.
......
// { 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;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment