]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: ICE when xobj is not the first parm [PR113389]
authorMarek Polacek <polacek@redhat.com>
Thu, 18 Jan 2024 00:16:32 +0000 (19:16 -0500)
committerMarek Polacek <polacek@redhat.com>
Thu, 18 Jan 2024 14:11:57 +0000 (09:11 -0500)
In grokdeclarator/cdk_function the comment says that the find_xobj_parm
lambda clears TREE_PURPOSE so that we can correctly detect an xobj that
is not the first parameter.  That's all good, but we should also clear
the TREE_PURPOSE once we've given the error, otherwise we crash later in
check_default_argument because the 'this' TREE_PURPOSE lacks a type.

PR c++/113389

gcc/cp/ChangeLog:

* decl.cc (grokdeclarator) <case cdk_function>: Set TREE_PURPOSE to
NULL_TREE when emitting an error.

gcc/testsuite/ChangeLog:

* g++.dg/cpp23/explicit-obj-diagnostics10.C: New test.

gcc/cp/decl.cc
gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics10.C [new file with mode: 0644]

index 322e48dee2e205c1112fa480e84b4c78d7a85529..3e41fd4fa313ce55dd8381e42f97e249cf23ae51 100644 (file)
@@ -13391,6 +13391,7 @@ grokdeclarator (const cp_declarator *declarator,
                  if (TREE_PURPOSE (parm) != this_identifier)
                    continue;
                  bad_xobj_parm_encountered = true;
+                 TREE_PURPOSE (parm) = NULL_TREE;
                  gcc_rich_location bad_xobj_parm
                    (DECL_SOURCE_LOCATION (TREE_VALUE (parm)));
                  error_at (&bad_xobj_parm,
diff --git a/gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics10.C b/gcc/testsuite/g++.dg/cpp23/explicit-obj-diagnostics10.C
new file mode 100644 (file)
index 0000000..354823d
--- /dev/null
@@ -0,0 +1,8 @@
+// PR c++/113389
+// { dg-do compile { target c++23 } }
+
+struct A {
+  void foo(A, this A); // { dg-error "only the first parameter" }
+  void qux(A, this A,  // { dg-error "only the first parameter" }
+          this A);     // { dg-error "only the first parameter" }
+};