On 12/14/24 3:29 AM, Jakub Jelinek wrote:
Hi!
In r10-6457 aka PR92593 fix a check has been added to reject
earlier non-static data members with current_class_type in templates,
as the deduction then can result in endless recursion in reshape_init.
It fixed the
template <class T>
struct S { S s = 1; };
S t{2};
crashes, but as the following testcase shows, didn't catch when there
are cv qualifiers on the non-static data member.
Fixed by using TYPE_MAIN_VARIANT.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK.
2024-12-14 Jakub Jelinek <ja...@redhat.com>
PR c++/116108
gcc/cp/
* decl.cc (grokdeclarator): Pass TYYPE_MAIN_VARIANT (type)
rather than type to same_type_p when checking if the non-static
data member doesn't have current class type.
gcc/testsuite/
* g++.dg/cpp1z/class-deduction117.C: New test.
--- gcc/cp/decl.cc.jj 2024-12-11 17:27:52.484221268 +0100
+++ gcc/cp/decl.cc 2024-12-13 17:05:24.445418705 +0100
@@ -15124,7 +15124,8 @@ grokdeclarator (const cp_declarator *dec
}
else if (!staticp
&& ((current_class_type
- && same_type_p (type, current_class_type))
+ && same_type_p (TYPE_MAIN_VARIANT (type),
+ current_class_type))
|| (!dependent_type_p (type)
&& !COMPLETE_TYPE_P (complete_type (type))
&& (!complete_or_array_type_p (type)
--- gcc/testsuite/g++.dg/cpp1z/class-deduction117.C.jj 2024-12-13
17:17:38.493973975 +0100
+++ gcc/testsuite/g++.dg/cpp1z/class-deduction117.C 2024-12-13
17:16:15.233158656 +0100
@@ -0,0 +1,7 @@
+// PR c++/116108
+// { dg-do compile { target c++11 } }
+template <class T>
+struct S { const S s = 1; }; // { dg-error "field 's' has incomplete type 'const
S<T>'" }
+S t{2}; // { dg-error "invalid use of template-name 'S'
without an argument list" "" { target c++14_down } }
+// { dg-error "class template argument deduction failed" "" { target c++17 }
.-1 }
+// { dg-error "no matching function for call to 'S\\\(int\\\)'" "" { target
c++17 } .-2 }
Jakub