From: Jakub Jelinek Date: Tue, 17 Dec 2024 09:13:24 +0000 (+0100) Subject: c++: Diagnose earlier non-static data members with cv containing class type [PR116108] X-Git-Tag: releases/gcc-12.5.0~102 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11919b5ac5e5b3c00fda2e2f0b8ce4d53f78691d;p=thirdparty%2Fgcc.git c++: Diagnose earlier non-static data members with cv containing class type [PR116108] 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 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. 2024-12-17 Jakub Jelinek 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. (cherry picked from commit 88bfee560681d8248b89f130ada249e35ee2e344) --- diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 878b14fe771..c31ba20476a 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -14130,7 +14130,8 @@ grokdeclarator (const cp_declarator *declarator, } 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) diff --git a/gcc/testsuite/g++.dg/cpp1z/class-deduction117.C b/gcc/testsuite/g++.dg/cpp1z/class-deduction117.C new file mode 100644 index 00000000000..8ab91018377 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp1z/class-deduction117.C @@ -0,0 +1,7 @@ +// PR c++/116108 +// { dg-do compile { target c++11 } } +template +struct S { const S s = 1; }; // { dg-error "field 's' has incomplete type 'const S'" } +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 }