]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: Diagnose earlier non-static data members with cv containing class type [PR116108]
authorJakub Jelinek <jakub@redhat.com>
Tue, 17 Dec 2024 09:13:24 +0000 (10:13 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 13 Jun 2025 09:47:50 +0000 (11:47 +0200)
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.

2024-12-17  Jakub Jelinek  <jakub@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.

(cherry picked from commit 88bfee560681d8248b89f130ada249e35ee2e344)

gcc/cp/decl.cc
gcc/testsuite/g++.dg/cpp1z/class-deduction117.C [new file with mode: 0644]

index 878b14fe771d01b538fb21d964385947f2e9af32..c31ba20476aa720ec23f6b2774fded897050494a 100644 (file)
@@ -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 (file)
index 0000000..8ab9101
--- /dev/null
@@ -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 }