diff options
author | Richard Smith <richard@metafoo.co.uk> | 2020-01-15 18:37:32 -0800 |
---|---|---|
committer | Richard Smith <richard@metafoo.co.uk> | 2020-01-15 18:38:23 -0800 |
commit | 45d70806f4386adfb62b0d75949a8aad58e0576f (patch) | |
tree | c09ac3dffb863ecaa493c3bd3ffae52e99c072be /clang/lib/Parse/ParseDecl.cpp | |
parent | 154cd6de513e1e9ce794ba2d1eae1647c873f812 (diff) | |
download | llvm-45d70806f4386adfb62b0d75949a8aad58e0576f.zip llvm-45d70806f4386adfb62b0d75949a8aad58e0576f.tar.gz llvm-45d70806f4386adfb62b0d75949a8aad58e0576f.tar.bz2 |
PR42694 Support explicit(bool) in older language modes as an extension.
This needs somewhat careful disambiguation, as C++2a explicit(bool) is a
breaking change. We only enable it in cases where the source construct
could not possibly be anything else.
Diffstat (limited to 'clang/lib/Parse/ParseDecl.cpp')
-rw-r--r-- | clang/lib/Parse/ParseDecl.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp index 69a3ed9..d8c5a0a 100644 --- a/clang/lib/Parse/ParseDecl.cpp +++ b/clang/lib/Parse/ParseDecl.cpp @@ -3617,7 +3617,11 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, ConsumedEnd = ExplicitLoc; ConsumeToken(); // kw_explicit if (Tok.is(tok::l_paren)) { - if (getLangOpts().CPlusPlus2a) { + if (getLangOpts().CPlusPlus2a || isExplicitBool() == TPResult::True) { + Diag(Tok.getLocation(), getLangOpts().CPlusPlus2a + ? diag::warn_cxx17_compat_explicit_bool + : diag::ext_explicit_bool); + ExprResult ExplicitExpr(static_cast<Expr *>(nullptr)); BalancedDelimiterTracker Tracker(*this, tok::l_paren); Tracker.consumeOpen(); @@ -3630,8 +3634,9 @@ void Parser::ParseDeclarationSpecifiers(DeclSpec &DS, Actions.ActOnExplicitBoolSpecifier(ExplicitExpr.get()); } else Tracker.skipToEnd(); - } else + } else { Diag(Tok.getLocation(), diag::warn_cxx2a_compat_explicit_bool); + } } isInvalid = DS.setFunctionSpecExplicit(ExplicitLoc, PrevSpec, DiagID, ExplicitSpec, CloseParenLoc); |