aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2024-12-17 10:13:24 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2024-12-17 10:13:24 +0100
commit88bfee560681d8248b89f130ada249e35ee2e344 (patch)
tree8763ce58a62008475e4250eb7493049f696e5c81 /gcc
parent9684e70952ac159ce0b838533ce4e9c98474e1a8 (diff)
downloadgcc-88bfee560681d8248b89f130ada249e35ee2e344.zip
gcc-88bfee560681d8248b89f130ada249e35ee2e344.tar.gz
gcc-88bfee560681d8248b89f130ada249e35ee2e344.tar.bz2
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 <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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/decl.cc3
-rw-r--r--gcc/testsuite/g++.dg/cpp1z/class-deduction117.C7
2 files changed, 9 insertions, 1 deletions
diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc
index a1b9957..5bd0e21 100644
--- a/gcc/cp/decl.cc
+++ b/gcc/cp/decl.cc
@@ -15131,7 +15131,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 0000000..8ab9101
--- /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 <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 }