diff options
author | Jason Merrill <jason@redhat.com> | 2016-04-14 22:23:05 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2016-04-14 22:23:05 -0400 |
commit | 26144dde3b68a331a8db86a9c8eaaa63d572bce9 (patch) | |
tree | c7a53813d3d706b0dc74aadf3bfb2d89e39d703d /gcc | |
parent | eab43e698f00ecc489453c3811ec98d9cc094f69 (diff) | |
download | gcc-26144dde3b68a331a8db86a9c8eaaa63d572bce9.zip gcc-26144dde3b68a331a8db86a9c8eaaa63d572bce9.tar.gz gcc-26144dde3b68a331a8db86a9c8eaaa63d572bce9.tar.bz2 |
re PR c++/70528 (bogus error: constructor required before non-static data member)
PR c++/70528
* class.c (type_has_constexpr_default_constructor): Return true
for an implicitly declared constructor.
From-SVN: r235002
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/cp/class.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C | 1 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C | 4 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C | 2 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/cpp0x/pr70528.C | 16 |
7 files changed, 30 insertions, 7 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 6384ab8..12900d3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2016-04-14 Jason Merrill <jason@redhat.com> + PR c++/70528 + * class.c (type_has_constexpr_default_constructor): Return true + for an implicitly declared constructor. + PR c++/70622 * parser.c (cp_parser_init_declarator): Add auto_result parm. (cp_parser_simple_declaration): Pass it. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 02a992f..e6d5bb0 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -3346,7 +3346,6 @@ add_implicitly_declared_members (tree t, tree* access_decls, CLASSTYPE_LAZY_DEFAULT_CTOR (t) = 1; if (cxx_dialect >= cxx11) TYPE_HAS_CONSTEXPR_CTOR (t) - /* This might force the declaration. */ = type_has_constexpr_default_constructor (t); } @@ -5349,8 +5348,11 @@ type_has_constexpr_default_constructor (tree t) { if (!TYPE_HAS_COMPLEX_DFLT (t)) return trivial_default_constructor_is_constexpr (t); - /* Non-trivial, we need to check subobject constructors. */ - lazily_declare_fn (sfk_constructor, t); + /* Assume it's constexpr to avoid unnecessary instantiation; if the + definition would have made the class non-literal, it will still be + non-literal because of the base or member in question, and that + gives a better diagnostic. */ + return true; } fns = locate_ctor (t); return (fns && DECL_DECLARED_CONSTEXPR_P (fns)); diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C index 45e1ed2..42ca30a 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ctor12.C @@ -3,6 +3,7 @@ template <typename Tp> struct C { + C() = default; constexpr C(const Tp& r) { } }; diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C index a67505d..8d352d0 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-default-ctor.C @@ -7,6 +7,6 @@ struct A { struct B: A { }; constexpr int f(B b) { return b.i; } -struct C { C(); }; // { dg-message "calls non-constexpr" } -struct D: C { }; // { dg-message "no constexpr constructor" } +struct C { C(); }; // { dg-message "" } +struct D: C { }; // { dg-message "" } constexpr int g(D d) { return 42; } // { dg-error "invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C index 30e0a64..bf95b24 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ice6.C @@ -6,6 +6,6 @@ struct A A(int); }; -struct B : A {}; // { dg-error "no matching" } +struct B : A {}; // { dg-message "" } constexpr int foo(B) { return 0; } // { dg-error "invalid type" } diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C index 7a22f88..7e2d58b 100644 --- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C +++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor19.C @@ -8,7 +8,7 @@ struct A struct B : A { - using A::A; // { dg-error "inherited" } + using A::A; }; constexpr B b; // { dg-error "literal" } diff --git a/gcc/testsuite/g++.dg/cpp0x/pr70528.C b/gcc/testsuite/g++.dg/cpp0x/pr70528.C new file mode 100644 index 0000000..af1c84e --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/pr70528.C @@ -0,0 +1,16 @@ +// PR c++/70258 +// { dg-do compile { target c++11 } } + +template <class T> +struct H +{ + template <typename A = T, typename = decltype (A())> + H (); +}; + +struct J { + struct K { + int First = 0; + }; + H<K> FunctionMDInfo; +}; |