Skip to content

Commit

Permalink
[clang] add diagnose when member function contains invalid default ar…
Browse files Browse the repository at this point in the history
…gument

Fixed: #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
  • Loading branch information
HerrCai0907 committed Apr 25, 2023
1 parent f34ecb5 commit 3333e12
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 7 deletions.
2 changes: 2 additions & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
10 changes: 3 additions & 7 deletions clang/lib/Parse/ParseDecl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
5 changes: 5 additions & 0 deletions clang/test/Parser/cxx-member-initializers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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}}
};

0 comments on commit 3333e12

Please sign in to comment.