Explorar o código

Fix crash on 'destroy' with return type and no params (#5527)

Fuzzer-found crash
Jon Ross-Perkins hai 11 meses
pai
achega
90649d60f0

+ 3 - 1
toolchain/check/handle_function.cpp

@@ -64,7 +64,9 @@ auto HandleParseNode(Context& context, Parse::ReturnTypeId node_id) -> bool {
   // not on the pattern stacks yet. They are only needed in that case if we have
   // a return type, which we now know that we do.
   if (context.node_stack().PeekNodeKind() ==
-      Parse::NodeKind::IdentifierNameNotBeforeParams) {
+          Parse::NodeKind::IdentifierNameNotBeforeParams ||
+      context.node_stack().PeekNodeKind() ==
+          Parse::NodeKind::KeywordNameNotBeforeParams) {
     context.pattern_block_stack().Push();
     context.full_pattern_stack().PushFullPattern(
         FullPatternStack::Kind::ExplicitParamList);

+ 13 - 0
toolchain/check/testdata/class/min_prelude/destroy_decl.carbon

@@ -180,3 +180,16 @@ class C {
 // CHECK:STDERR:   ^~~~~~~~~~~~~~~~~~~~~~~~~
 // CHECK:STDERR:
 fn C.destroy.Foo() {}
+
+// --- fail_return_type_after_no_params.carbon
+
+library "[[@TEST_NAME]]";
+
+// Return type handling special-cases the "no params" case.
+class C {
+  // CHECK:STDERR: fail_return_type_after_no_params.carbon:[[@LINE+4]]:3: error: missing implicit `self` parameter [DestroyFunctionMissingSelf]
+  // CHECK:STDERR:   fn destroy -> ();
+  // CHECK:STDERR:   ^~~~~~~~~~~~~~~~~
+  // CHECK:STDERR:
+  fn destroy -> ();
+}