diff options
Diffstat (limited to 'lib/Parse/ParseExpr.cpp')
-rw-r--r-- | lib/Parse/ParseExpr.cpp | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/lib/Parse/ParseExpr.cpp b/lib/Parse/ParseExpr.cpp index 44b87af01abd0..bc587628c954d 100644 --- a/lib/Parse/ParseExpr.cpp +++ b/lib/Parse/ParseExpr.cpp @@ -66,12 +66,16 @@ using namespace clang; /// shift-expression '<<' additive-expression /// shift-expression '>>' additive-expression /// -/// relational-expression: [C99 6.5.8] +/// compare-expression: [C++20 expr.spaceship] /// shift-expression -/// relational-expression '<' shift-expression -/// relational-expression '>' shift-expression -/// relational-expression '<=' shift-expression -/// relational-expression '>=' shift-expression +/// compare-expression '<=>' shift-expression +/// +/// relational-expression: [C99 6.5.8] +/// compare-expression +/// relational-expression '<' compare-expression +/// relational-expression '>' compare-expression +/// relational-expression '<=' compare-expression +/// relational-expression '>=' compare-expression /// /// equality-expression: [C99 6.5.9] /// relational-expression @@ -266,11 +270,13 @@ bool Parser::diagnoseUnknownTemplateId(ExprResult LHS, SourceLocation Less) { return false; } -static bool isFoldOperator(prec::Level Level) { - return Level > prec::Unknown && Level != prec::Conditional; +bool Parser::isFoldOperator(prec::Level Level) const { + return Level > prec::Unknown && Level != prec::Conditional && + Level != prec::Spaceship; } -static bool isFoldOperator(tok::TokenKind Kind) { - return isFoldOperator(getBinOpPrecedence(Kind, false, true)); + +bool Parser::isFoldOperator(tok::TokenKind Kind) const { + return isFoldOperator(getBinOpPrecedence(Kind, GreaterThanIsOperator, true)); } /// \brief Parse a binary expression that starts with \p LHS and has a @@ -716,6 +722,7 @@ class CastExpressionIdValidator : public CorrectionCandidateCallback { /// '__is_sealed' [MS] /// '__is_trivial' /// '__is_union' +/// '__has_unique_object_representations' /// /// [Clang] unary-type-trait: /// '__is_aggregate' @@ -798,7 +805,8 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, case tok::kw_true: case tok::kw_false: - return ParseCXXBoolLiteral(); + Res = ParseCXXBoolLiteral(); + break; case tok::kw___objc_yes: case tok::kw___objc_no: @@ -1229,6 +1237,7 @@ ExprResult Parser::ParseCastExpression(bool isUnaryExpression, case tok::kw_half: case tok::kw_float: case tok::kw_double: + case tok::kw__Float16: case tok::kw___float128: case tok::kw_void: case tok::kw_typename: @@ -2729,7 +2738,7 @@ ExprResult Parser::ParseFoldExpression(ExprResult LHS, } } - Diag(EllipsisLoc, getLangOpts().CPlusPlus1z + Diag(EllipsisLoc, getLangOpts().CPlusPlus17 ? diag::warn_cxx14_compat_fold_expression : diag::ext_fold_expression); @@ -2762,7 +2771,7 @@ ExprResult Parser::ParseFoldExpression(ExprResult LHS, /// \endverbatim bool Parser::ParseExpressionList(SmallVectorImpl<Expr *> &Exprs, SmallVectorImpl<SourceLocation> &CommaLocs, - std::function<void()> Completer) { + llvm::function_ref<void()> Completer) { bool SawError = false; while (1) { if (Tok.is(tok::code_completion)) { @@ -2881,7 +2890,7 @@ ExprResult Parser::ParseBlockLiteralExpression() { // allows determining whether a variable reference inside the block is // within or outside of the block. ParseScope BlockScope(this, Scope::BlockScope | Scope::FnScope | - Scope::DeclScope); + Scope::CompoundStmtScope | Scope::DeclScope); // Inform sema that we are starting a block. Actions.ActOnBlockStart(CaretLoc, getCurScope()); |