aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-10-14 16:13:49 -0400
committerJason Merrill <jason@gcc.gnu.org>2019-10-14 16:13:49 -0400
commitac308262f344153d472b16c85cc1c3036ce43308 (patch)
tree21516f4b635028cee88b7647e3697a39de8158b2 /gcc
parent10aabe339a9eec4e81fbc56cacad7b532b33d20c (diff)
downloadgcc-ac308262f344153d472b16c85cc1c3036ce43308.zip
gcc-ac308262f344153d472b16c85cc1c3036ce43308.tar.gz
gcc-ac308262f344153d472b16c85cc1c3036ce43308.tar.bz2
PR c++/91930 - ICE with constrained inherited default ctor.
The testcase was crashing because lazily_declare_fn was failing to add a defaulted constructor, because the implicit declaration was less constrained than the inherited default constructor. But when we have an inherited constructor, we shouldn't be trying to declare a default constructor in the first place, because it counts as "a user-declared constructor". With that fixed I needed to adjust a couple of inherited constructor testcases that previously had been diagnosing the default constructor as deleted rather than not declared. * name-lookup.c (do_class_using_decl): Set TYPE_HAS_USER_CONSTRUCTOR for inherited constructor. From-SVN: r276968
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/name-lookup.c1
-rw-r--r--gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C4
-rw-r--r--gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor6.C12
5 files changed, 23 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 2864107..7245b3e 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2019-10-14 Jason Merrill <jason@redhat.com>
+
+ PR c++/91930 - ICE with constrained inherited default ctor.
+ * name-lookup.c (do_class_using_decl): Set TYPE_HAS_USER_CONSTRUCTOR
+ for inherited constructor.
+
2019-10-14 Paolo Carlini <paolo.carlini@oracle.com>
* decl.c (check_tag_decl): Use DECL_SOURCE_LOCATION.
diff --git a/gcc/cp/name-lookup.c b/gcc/cp/name-lookup.c
index 57ab129..9352ce5 100644
--- a/gcc/cp/name-lookup.c
+++ b/gcc/cp/name-lookup.c
@@ -4613,6 +4613,7 @@ do_class_using_decl (tree scope, tree name)
maybe_warn_cpp0x (CPP0X_INHERITING_CTORS);
name = ctor_identifier;
CLASSTYPE_NON_AGGREGATE (current_class_type) = true;
+ TYPE_HAS_USER_CONSTRUCTOR (current_class_type) = true;
}
/* Cannot introduce a constructor name. */
diff --git a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C
index d0038c1..673b638 100644
--- a/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C
+++ b/gcc/testsuite/g++.dg/cpp0x/inh-ctor5.C
@@ -6,13 +6,13 @@ struct B1 {
struct B2 {
B2(double) { }
};
-struct D1 : B1 { // { dg-error "no match" }
+struct D1 : B1 {
using B1::B1; // implicitly declares D1(int)
int x;
};
void test() {
D1 d(6); // OK: d.x is not initialized
- D1 e; // { dg-error "deleted" } D1 has no default constructor
+ D1 e; // { dg-error "no match" } D1 has no default constructor
}
struct D2 : B2 {
using B2::B2; // { dg-error "B1::B1" }
diff --git a/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C b/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C
index 02ec58a..98336a1 100644
--- a/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C
+++ b/gcc/testsuite/g++.dg/cpp1z/inh-ctor22.C
@@ -12,7 +12,7 @@ struct B2 {
int get();
-struct D1 : B1 { // { dg-message "B1::B1" }
+struct D1 : B1 {
using B1::B1; // inherits B1(int, ...)
int x;
int y = get();
@@ -22,7 +22,7 @@ void test() {
D1 d(2, 3, 4); // OK: B1 is initialized by calling B1(2, 3, 4),
// then d.x is default-initialized (no initialization is performed),
// then d.y is initialized by calling get()
- D1 e; // { dg-error "" } D1 has a deleted default constructor
+ D1 e; // { dg-error "" } D1 has no default constructor
}
struct D2 : B2 {
diff --git a/gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor6.C b/gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor6.C
new file mode 100644
index 0000000..c92d6ac
--- /dev/null
+++ b/gcc/testsuite/g++.dg/cpp2a/concepts-inherit-ctor6.C
@@ -0,0 +1,12 @@
+// PR c++/91930
+// { dg-do compile { target c++2a } }
+
+template <typename T> struct basic_mixin {
+ basic_mixin() requires true;
+};
+
+struct mixin : basic_mixin<int> {
+ using basic_mixin<int>::basic_mixin;
+};
+
+mixin m;