diff options
-rw-r--r-- | gcc/cp/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/cp/decl.c | 9 | ||||
-rw-r--r-- | gcc/cp/pt.c | 1 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/initlist10.C | 53 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tc1/dr152.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.eh/ctor1.C | 2 |
7 files changed, 72 insertions, 12 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 124dc3f..4987ca4 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2008-12-03 Jason Merrill <jason@redhat.com> + + 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 <jason@redhat.com> PR c++/35782, c++/37860 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index d045935..8714432 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 8de27a6..db81942 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 e62b980..4a574eb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2008-12-03 Jason Merrill <jason@redhat.com> + + 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 <jakub@redhat.com> 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 0000000..bf955f5 --- /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<typename _Ttype, typename _Tvalue> + 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()<std::atomic_bool, bool>(); + return 0; +} diff --git a/gcc/testsuite/g++.dg/tc1/dr152.C b/gcc/testsuite/g++.dg/tc1/dr152.C index a635213..cac7aac 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 <class T> 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 ac2f24f..1cd71c4 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 }; |