Commit 665e3b21 by Jason Merrill Committed by Jason Merrill

PR c++/92552 - ICE with inherited constrained default ctor.

We set TYPE_HAS_USER_CONSTRUCTOR on the template type in lookup_using_decl,
but we didn't copy it to the instantiation.  Setting it in
one_inherited_ctor is too late, as that gets called after we decide whether
to set CLASSTYPE_LAZY_DEFAULT_CTOR.  This change affects other testcases as
well; the changes are fixes for the other inherited constructor tests as
well.

	* pt.c (instantiate_class_template_1): Copy
	TYPE_HAS_USER_CONSTRUCTOR.
	* class.c (one_inherited_ctor): Don't set it here.

From-SVN: r279936
parent e4bcf1f5
2020-01-06 Jason Merrill <jason@redhat.com>
PR c++/92552 - ICE with inherited constrained default ctor.
* pt.c (instantiate_class_template_1): Copy
TYPE_HAS_USER_CONSTRUCTOR.
* class.c (one_inherited_ctor): Don't set it here.
2020-01-06 Andrew Sutton <asutton@lock3software.com> 2020-01-06 Andrew Sutton <asutton@lock3software.com>
PR c++/92739 - parsing requires clause with attributes. PR c++/92739 - parsing requires clause with attributes.
......
...@@ -3141,7 +3141,6 @@ one_inherited_ctor (tree ctor, tree t, tree using_decl) ...@@ -3141,7 +3141,6 @@ one_inherited_ctor (tree ctor, tree t, tree using_decl)
ctor = implicitly_declare_fn (sfk_inheriting_constructor, ctor = implicitly_declare_fn (sfk_inheriting_constructor,
t, /*const*/false, ctor, parms); t, /*const*/false, ctor, parms);
add_method (t, ctor, using_decl != NULL_TREE); add_method (t, ctor, using_decl != NULL_TREE);
TYPE_HAS_USER_CONSTRUCTOR (t) = true;
return; return;
} }
......
...@@ -11544,6 +11544,7 @@ instantiate_class_template_1 (tree type) ...@@ -11544,6 +11544,7 @@ instantiate_class_template_1 (tree type)
SET_TYPE_ALIGN (type, TYPE_ALIGN (pattern)); SET_TYPE_ALIGN (type, TYPE_ALIGN (pattern));
TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (pattern); TYPE_USER_ALIGN (type) = TYPE_USER_ALIGN (pattern);
CLASSTYPE_NON_AGGREGATE (type) = CLASSTYPE_NON_AGGREGATE (pattern); CLASSTYPE_NON_AGGREGATE (type) = CLASSTYPE_NON_AGGREGATE (pattern);
TYPE_HAS_USER_CONSTRUCTOR (type) = TYPE_HAS_USER_CONSTRUCTOR (pattern);
if (ANON_AGGR_TYPE_P (pattern)) if (ANON_AGGR_TYPE_P (pattern))
SET_ANON_AGGR_TYPE_P (type); SET_ANON_AGGR_TYPE_P (type);
if (CLASSTYPE_VISIBILITY_SPECIFIED (pattern)) if (CLASSTYPE_VISIBILITY_SPECIFIED (pattern))
......
...@@ -11,7 +11,7 @@ template<typename T> ...@@ -11,7 +11,7 @@ template<typename T>
}; };
template<typename T> template<typename T>
struct S2 : S1<T> { // { dg-error "no matching function" } struct S2 : S1<T> {
using S1<T>::S1; // { dg-error "no matching function" } using S1<T>::S1; // { dg-error "no matching function" }
}; };
...@@ -19,5 +19,5 @@ struct X { } x; ...@@ -19,5 +19,5 @@ struct X { } x;
int main() { int main() {
S2<X> s1(0); // { dg-error "use of deleted function" } S2<X> s1(0); // { dg-error "use of deleted function" }
S2<X> s2; // { dg-error "use of deleted function" } S2<X> s2; // { dg-error "no matching function" }
} }
...@@ -9,10 +9,10 @@ template<typename T> ...@@ -9,10 +9,10 @@ template<typename T>
}; };
template<typename T> template<typename T>
struct S2 : S1<T> { // { dg-error "matching" } struct S2 : S1<T> {
using S1<T>::S1; using S1<T>::S1;
}; };
int main() { int main() {
S2<int> s; // { dg-error "deleted function" } S2<int> s; // { dg-error "no matching function" }
} }
// PR c++/92552
// { dg-do compile { target concepts } }
template <typename T> struct basic_mixin {
basic_mixin() requires true;
};
template <typename Cur>
struct mixin : basic_mixin<Cur> {
using basic_mixin<Cur>::basic_mixin;
};
int main() {
(void)__is_constructible(mixin<int>);
// noexcept(mixin<int>()); also triggers ICE
}
...@@ -10,6 +10,4 @@ template <typename> struct A ...@@ -10,6 +10,4 @@ template <typename> struct A
template <typename> A(typename A::X) {} // { dg-error "incomplete" } template <typename> A(typename A::X) {} // { dg-error "incomplete" }
}; };
// We currently don't give the "no match" error because we don't add the A<void> a; // { dg-message "no match" }
// invalid constructor template to TYPE_METHODS.
A<void> a; // { dg-message "required" }
...@@ -9,7 +9,7 @@ public: ...@@ -9,7 +9,7 @@ public:
void f () void f ()
{ {
Test<void> c; // { dg-message "required" } Test<void> c; // { dg-error "no match" }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment