diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index e25f4e04490..61778830bf1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,8 @@ 2011-06-29 Jason Merrill + * class.c (finalize_literal_type_property): Update conditions. + * method.c (defaulted_late_check): Set TYPE_HAS_CONSTEXPR_CTOR. + * tree.c (build_vec_init_expr): Don't add TARGET_EXPR. * typeck2.c (digest_init_r): Handle VEC_INIT_EXPR. * semantics.c (cxx_eval_vec_init_1): Correct type. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 9e387a6923e..9054b5caa18 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -4566,12 +4566,10 @@ finalize_literal_type_property (tree t) tree fn; if (cxx_dialect < cxx0x - || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) - /* FIXME These constraints seem unnecessary; remove from standard. - || !TYPE_HAS_TRIVIAL_COPY_CTOR (t) - || TYPE_HAS_COMPLEX_MOVE_CTOR (t)*/ ) + || TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)) CLASSTYPE_LITERAL_P (t) = false; else if (CLASSTYPE_LITERAL_P (t) && !TYPE_HAS_TRIVIAL_DFLT (t) + && CLASSTYPE_NON_AGGREGATE (t) && !TYPE_HAS_CONSTEXPR_CTOR (t)) CLASSTYPE_LITERAL_P (t) = false; diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 48b9c74e78e..de43a386f77 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1571,10 +1571,14 @@ defaulted_late_check (tree fn) } TREE_TYPE (fn) = build_exception_variant (TREE_TYPE (fn), eh_spec); if (DECL_DECLARED_CONSTEXPR_P (implicit_fn)) - /* Hmm...should we do this for out-of-class too? Should it be OK to - add constexpr later like inline, rather than requiring - declarations to match? */ - DECL_DECLARED_CONSTEXPR_P (fn) = true; + { + /* Hmm...should we do this for out-of-class too? Should it be OK to + add constexpr later like inline, rather than requiring + declarations to match? */ + DECL_DECLARED_CONSTEXPR_P (fn) = true; + if (kind == sfk_constructor) + TYPE_HAS_CONSTEXPR_CTOR (ctx) = true; + } } if (!DECL_DECLARED_CONSTEXPR_P (implicit_fn) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6fefc387988..4e2ebc3a155 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2011-06-29 Jason Merrill + + * g++.dg/cpp0x/constexpr-is_literal.C: Adjust. + 2011-06-29 Richard Guenther * gcc.dg/tree-ssa/loop-17.c: Adjust. diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C index d1b95437db3..82514ed865a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-is_literal.C @@ -33,6 +33,7 @@ YES(NotLiteral (NotLiteral::*)(NotLiteral)); struct A { A(const A&) = default; + A(int); }; NO(A); // no constexpr ctor other than copy