Author: Congcong Cai Date: 2023-04-25T23:08:30+02:00 New Revision: 3333e12753ed9c27fc25c73858a990081b0ceb11
URL: https://github.com/llvm/llvm-project/commit/3333e12753ed9c27fc25c73858a990081b0ceb11 DIFF: https://github.com/llvm/llvm-project/commit/3333e12753ed9c27fc25c73858a990081b0ceb11.diff LOG: [clang] add diagnose when member function contains invalid default argument Fixed: https://github.com/llvm/llvm-project/issues/62122 This change pointer to add diagnose message for this code. ``` struct S { static int F(int n = 0 ? 0) { return 0; } }; ``` For default parameter, we should set it as unparsed even if meeting syntax error because it should be issued in real parser time instead of set is as invalid directly without diagnose. Reviewed By: rsmith Differential Revision: https://reviews.llvm.org/D148372 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Parse/ParseDecl.cpp clang/test/Parser/cxx-member-initializers.cpp Removed: ################################################################################ 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 <https://github.com/llvm/llvm-project/issues/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 <https://github.com/llvm/llvm-project/issues/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}} }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits