diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index a1bb925e8ae24..55ec1cdef52fa 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -321,6 +321,8 @@ Bug Fixes in This Version (`#61885 `_) - Clang constexpr evaluator now treats comparison of [[gnu::weak]]-attributed member pointer as an invalid expression. +- Fix crash when member function contains invalid default argument. + (`#62122 `_) Bug Fixes to Compiler Builtins ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 18897188828f1..728879e20de78 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -7381,13 +7381,9 @@ void Parser::ParseParameterDeclarationClause( DefArgToks.reset(new CachedTokens); SourceLocation ArgStartLoc = NextToken().getLocation(); - if (!ConsumeAndStoreInitializer(*DefArgToks, CIK_DefaultArgument)) { - DefArgToks.reset(); - Actions.ActOnParamDefaultArgumentError(Param, EqualLoc); - } else { - Actions.ActOnParamUnparsedDefaultArgument(Param, EqualLoc, - ArgStartLoc); - } + ConsumeAndStoreInitializer(*DefArgToks, CIK_DefaultArgument); + Actions.ActOnParamUnparsedDefaultArgument(Param, EqualLoc, + ArgStartLoc); } else { // Consume the '='. ConsumeToken(); diff --git a/clang/test/Parser/cxx-member-initializers.cpp b/clang/test/Parser/cxx-member-initializers.cpp index c29260b731223..57f707cee52be 100644 --- a/clang/test/Parser/cxx-member-initializers.cpp +++ b/clang/test/Parser/cxx-member-initializers.cpp @@ -108,4 +108,9 @@ class G { // expected-error@-2 {{type name requires a specifier or qualifier}} // expected-error@-3 {{expected '>'}} // expected-note@-4 {{to match this '<'}} + + void n(int x = 1 ? 2) {} + // expected-error@-1 {{expected ':'}} + // expected-note@-2 {{to match this '?'}} + // expected-error@-3 {{expected expression}} };