From 27fb09b78e186d3d0173ee42cfc0af6801c2a9e2 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Wed, 3 Dec 2008 14:22:08 -0500 Subject: [PATCH] re PR c++/38380 (explicitly defaulted constructors vs. empty direct initialization) PR c++/38380 * decl.c (grokdeclarator): Only set DECL_NONCONVERTING_P on explicit constructors. * pt.c (tsubst_copy_and_build) [CONSTRUCTOR]: Propagate CONSTRUCTOR_IS_DIRECT_INIT. From-SVN: r142404 --- gcc/cp/ChangeLog | 8 ++++ gcc/cp/decl.c | 9 ---- gcc/cp/pt.c | 1 + gcc/testsuite/ChangeLog | 7 +++ gcc/testsuite/g++.dg/cpp0x/initlist10.C | 53 +++++++++++++++++++++++ gcc/testsuite/g++.dg/tc1/dr152.C | 4 +- gcc/testsuite/g++.old-deja/g++.eh/ctor1.C | 2 +- 7 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/initlist10.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 124dc3f959fb..4987ca48687b 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2008-12-03 Jason Merrill + + PR c++/38380 + * decl.c (grokdeclarator): Only set DECL_NONCONVERTING_P + on explicit constructors. + * pt.c (tsubst_copy_and_build) [CONSTRUCTOR]: Propagate + CONSTRUCTOR_IS_DIRECT_INIT. + 2008-12-02 Jason Merrill PR c++/35782, c++/37860 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d045935445e4..87144324272e 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -9099,15 +9099,6 @@ grokdeclarator (const cp_declarator *declarator, is called a converting constructor. */ if (explicitp == 2) DECL_NONCONVERTING_P (decl) = 1; - else if (DECL_CONSTRUCTOR_P (decl)) - { - /* A constructor with no parms is not a conversion. - Ignore any compiler-added parms. */ - tree arg_types = FUNCTION_FIRST_USER_PARMTYPE (decl); - - if (arg_types == void_list_node) - DECL_NONCONVERTING_P (decl) = 1; - } } else if (TREE_CODE (type) == METHOD_TYPE) { diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 8de27a6a9139..db81942eb00e 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -11612,6 +11612,7 @@ tsubst_copy_and_build (tree t, } r = build_constructor (init_list_type_node, n); + CONSTRUCTOR_IS_DIRECT_INIT (r) = CONSTRUCTOR_IS_DIRECT_INIT (t); if (TREE_HAS_CONSTRUCTOR (t)) return finish_compound_literal (type, r); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e62b98019b9c..4a574ebdb169 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-12-03 Jason Merrill + + PR c++/38380 + * g++.dg/cpp0x/initlist10.C: New test. + * g++.old-deja/g++.eh/ctor1.C: Default ctor is a candidate too. + * g++.dg/tc1/dr152.C: Likewise. + 2008-12-03 Jakub Jelinek PR middle-end/38360 diff --git a/gcc/testsuite/g++.dg/cpp0x/initlist10.C b/gcc/testsuite/g++.dg/cpp0x/initlist10.C new file mode 100644 index 000000000000..bf955f513e33 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/initlist10.C @@ -0,0 +1,53 @@ +// PR c++/38380 +// { dg-options "-std=gnu++0x" } + +namespace std +{ + struct atomic_bool + { + bool _M_i; + + atomic_bool() = default; + ~atomic_bool() = default; + atomic_bool(const atomic_bool&) = delete; + atomic_bool& operator=(const atomic_bool&) = delete; + + explicit atomic_bool(bool __i) { _M_i = __i; } + + operator bool() const volatile + { return true; } + }; +} + +namespace __gnu_test +{ + struct direct_list_initializable + { + template + void + operator()() + { + struct _Concept + { + void __constraint() + { + _Ttype __v1 = { }; // default ctor + _Ttype __v2 { __a }; // single-argument ctor + } + + _Tvalue __a; + }; + + void (_Concept::*__x)() __attribute__((unused)) + = &_Concept::__constraint; + } + }; +} + +int main() +{ + __gnu_test::direct_list_initializable test; + + test.operator()(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr152.C b/gcc/testsuite/g++.dg/tc1/dr152.C index a635213b3a7d..cac7aacc0ebc 100644 --- a/gcc/testsuite/g++.dg/tc1/dr152.C +++ b/gcc/testsuite/g++.dg/tc1/dr152.C @@ -4,7 +4,7 @@ namespace N1 { struct X { - X(); + X(); // { dg-message "candidate" } explicit X(const X&); }; void f(X); @@ -19,7 +19,7 @@ namespace N1 { namespace N2 { template struct X { - X(); + X(); // { dg-message "candidate" } explicit X(const X&); }; diff --git a/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C b/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C index ac2f24f60ceb..1cd71c4d82a4 100644 --- a/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C +++ b/gcc/testsuite/g++.old-deja/g++.eh/ctor1.C @@ -1,7 +1,7 @@ // { dg-do assemble } struct A { - A(); + A(); // { dg-message "" } candidate A(A&); // { dg-message "candidates" } referenced below };