From: Jason Merrill Date: Mon, 2 Jan 2012 17:53:28 +0000 (-0500) Subject: DR 1359 PR c++/51675 X-Git-Tag: releases/gcc-4.7.0~1222 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=ab807569b6233bc5226dda1e67504d7d09114529;p=gcc.git DR 1359 PR c++/51675 DR 1359 PR c++/51675 * method.c (walk_field_subobs): Don't check for uninitialized fields in a union. (synthesized_method_walk): Check here. From-SVN: r182810 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7668a7b6e089..9eb688263a77 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,11 @@ 2012-01-02 Jason Merrill + DR 1359 + PR c++/51675 + * method.c (walk_field_subobs): Don't check for uninitialized + fields in a union. + (synthesized_method_walk): Check here. + DR 325 PR c++/51666 * parser.c (cp_parser_cache_defarg): Split out... diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 8101f8a11c7c..cf2a713aa2a8 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -1063,7 +1063,8 @@ walk_field_subobs (tree fields, tree fnname, special_function_kind sfk, /* For an implicitly-defined default constructor to be constexpr, every member must have a user-provided default constructor or an explicit initializer. */ - if (constexpr_p && !CLASS_TYPE_P (mem_type)) + if (constexpr_p && !CLASS_TYPE_P (mem_type) + && TREE_CODE (DECL_CONTEXT (field)) != UNION_TYPE) { *constexpr_p = false; if (msg) @@ -1208,12 +1209,19 @@ synthesized_method_walk (tree ctype, special_function_kind sfk, bool const_p, resolution, so a constructor can be trivial even if it would otherwise call a non-trivial constructor. */ if (expected_trivial - && !diag && (!copy_arg_p || cxx_dialect < cxx0x)) { if (constexpr_p && sfk == sfk_constructor) - *constexpr_p = trivial_default_constructor_is_constexpr (ctype); - return; + { + bool cx = trivial_default_constructor_is_constexpr (ctype); + *constexpr_p = cx; + if (diag && !cx && TREE_CODE (ctype) == UNION_TYPE) + /* A trivial constructor doesn't have any NSDMI. */ + inform (input_location, "defaulted default constructor does " + "not initialize any non-static data member"); + } + if (!diag) + return; } ++cp_unevaluated_operand; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e1e0dfeff7d2..79d43fac0758 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2012-01-02 Jason Merrill + PR c++/51675 + * g++.dg/cpp0x/constexpr-union2.C: New. + PR c++/51666 * g++.dg/cpp0x/nsdmi-defer5.C: New. diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C new file mode 100644 index 000000000000..0bf2aa7e2bc5 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-union2.C @@ -0,0 +1,18 @@ +// PR c++/51675 +// { dg-options -std=c++0x } + +union foo +{ + int x = 0; + short y; + + constexpr foo() = default; +}; + +union bar +{ + int x; + short y; + + constexpr bar() = default; // { dg-error "constexpr" } +};