Author: Vlad Serebrennikov
Date: 2025-04-30T07:01:01+03:00
New Revision: e8c684a0e4299077904892d11b1906f8e660eb01

URL: 
https://github.com/llvm/llvm-project/commit/e8c684a0e4299077904892d11b1906f8e660eb01
DIFF: 
https://github.com/llvm/llvm-project/commit/e8c684a0e4299077904892d11b1906f8e660eb01.diff

LOG: [clang][NFC] Convert `Parser::ParenParseOption` to scoped enum

Added: 
    

Modified: 
    clang/include/clang/Parse/Parser.h
    clang/lib/Parse/ParseExpr.cpp
    clang/lib/Parse/ParseExprCXX.cpp
    clang/lib/Parse/Parser.cpp

Removed: 
    


################################################################################
diff  --git a/clang/include/clang/Parse/Parser.h 
b/clang/include/clang/Parse/Parser.h
index 5248cb2219d73..01862e4534664 100644
--- a/clang/include/clang/Parse/Parser.h
+++ b/clang/include/clang/Parse/Parser.h
@@ -107,6 +107,15 @@ enum class TypeCastState { NotTypeCast = 0, MaybeTypeCast, 
IsTypeCast };
 /// Control what ParseCastExpression will parse.
 enum class CastParseKind { AnyCastExpr = 0, UnaryExprOnly, PrimaryExprOnly };
 
+/// ParenParseOption - Control what ParseParenExpression will parse.
+enum class ParenParseOption {
+  SimpleExpr,      // Only parse '(' expression ')'
+  FoldExpr,        // Also allow fold-expression <anything>
+  CompoundStmt,    // Also allow '(' compound-statement ')'
+  CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}'
+  CastExpr         // Also allow '(' type-name ')' <anything>
+};
+
 /// Parser - This implements a parser for the C family of languages.  After
 /// parsing units of the grammar, productions are invoked to handle whatever 
has
 /// been read.
@@ -1951,14 +1960,6 @@ class Parser : public CodeCompletionHandler {
   /// used for misc language extensions.
   bool ParseSimpleExpressionList(SmallVectorImpl<Expr *> &Exprs);
 
-  /// ParenParseOption - Control what ParseParenExpression will parse.
-  enum ParenParseOption {
-    SimpleExpr,      // Only parse '(' expression ')'
-    FoldExpr,        // Also allow fold-expression <anything>
-    CompoundStmt,    // Also allow '(' compound-statement ')'
-    CompoundLiteral, // Also allow '(' type-name ')' '{' ... '}'
-    CastExpr         // Also allow '(' type-name ')' <anything>
-  };
   ExprResult ParseParenExpression(ParenParseOption &ExprType,
                                         bool stopIfCastExpr,
                                         bool isTypeCast,

diff  --git a/clang/lib/Parse/ParseExpr.cpp b/clang/lib/Parse/ParseExpr.cpp
index 8c821ef0c95bf..a5dd08529cf37 100644
--- a/clang/lib/Parse/ParseExpr.cpp
+++ b/clang/lib/Parse/ParseExpr.cpp
@@ -1105,7 +1105,7 @@ ExprResult Parser::ParseCastExpression(CastParseKind 
ParseKind,
         ParenExprType = ParenParseOption::CastExpr;
         break;
       case CastParseKind::PrimaryExprOnly:
-        ParenExprType = FoldExpr;
+        ParenExprType = ParenParseOption::FoldExpr;
         break;
     }
     ParsedType CastTy;
@@ -1121,17 +1121,19 @@ ExprResult Parser::ParseCastExpression(CastParseKind 
ParseKind,
       return Res;
 
     switch (ParenExprType) {
-    case SimpleExpr:   break;    // Nothing else to do.
-    case CompoundStmt: break;  // Nothing else to do.
-    case CompoundLiteral:
+    case ParenParseOption::SimpleExpr:
+      break; // Nothing else to do.
+    case ParenParseOption::CompoundStmt:
+      break; // Nothing else to do.
+    case ParenParseOption::CompoundLiteral:
       // We parsed '(' type-name ')' '{' ... '}'.  If any suffixes of
       // postfix-expression exist, parse them now.
       break;
-    case CastExpr:
+    case ParenParseOption::CastExpr:
       // We have parsed the cast-expression and no postfix-expr pieces are
       // following.
       return Res;
-    case FoldExpr:
+    case ParenParseOption::FoldExpr:
       // We only parsed a fold-expression. There might be postfix-expr pieces
       // afterwards; parse them now.
       break;
@@ -2528,7 +2530,7 @@ Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token 
&OpTok,
     // type-name, or it is a unary-expression that starts with a compound
     // literal, or starts with a primary-expression that is a parenthesized
     // expression.
-    ParenParseOption ExprType = CastExpr;
+    ParenParseOption ExprType = ParenParseOption::CastExpr;
     SourceLocation LParenLoc = Tok.getLocation(), RParenLoc;
 
     Operand = ParseParenExpression(ExprType, true/*stopIfCastExpr*/,
@@ -2537,7 +2539,7 @@ Parser::ParseExprAfterUnaryExprOrTypeTrait(const Token 
&OpTok,
 
     // If ParseParenExpression parsed a '(typename)' sequence only, then this 
is
     // a type.
-    if (ExprType == CastExpr) {
+    if (ExprType == ParenParseOption::CastExpr) {
       isCastExpr = true;
       return ExprEmpty();
     }
@@ -3095,7 +3097,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
     cutOffParsing();
     Actions.CodeCompletion().CodeCompleteExpression(
         getCurScope(), PreferredType.get(Tok.getLocation()),
-        /*IsParenthesized=*/ExprType >= CompoundLiteral);
+        /*IsParenthesized=*/ExprType >= ParenParseOption::CompoundLiteral);
     return ExprError();
   }
 
@@ -3119,7 +3121,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
 
   // None of these cases should fall through with an invalid Result
   // unless they've already reported an error.
-  if (ExprType >= CompoundStmt && Tok.is(tok::l_brace)) {
+  if (ExprType >= ParenParseOption::CompoundStmt && Tok.is(tok::l_brace)) {
     Diag(Tok, OpenLoc.isMacroID() ? diag::ext_gnu_statement_expr_macro
                                   : diag::ext_gnu_statement_expr);
 
@@ -3142,7 +3144,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
       Actions.ActOnStartStmtExpr();
 
       StmtResult Stmt(ParseCompoundStatement(true));
-      ExprType = CompoundStmt;
+      ExprType = ParenParseOption::CompoundStmt;
 
       // If the substmt parsed correctly, build the AST node.
       if (!Stmt.isInvalid()) {
@@ -3152,7 +3154,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
         Actions.ActOnStmtExprError();
       }
     }
-  } else if (ExprType >= CompoundLiteral && BridgeCast) {
+  } else if (ExprType >= ParenParseOption::CompoundLiteral && BridgeCast) {
     tok::TokenKind tokenKind = Tok.getKind();
     SourceLocation BridgeKeywordLoc = ConsumeToken();
 
@@ -3189,7 +3191,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
     return Actions.ObjC().ActOnObjCBridgedCast(getCurScope(), OpenLoc, Kind,
                                                BridgeKeywordLoc, Ty.get(),
                                                RParenLoc, SubExpr.get());
-  } else if (ExprType >= CompoundLiteral &&
+  } else if (ExprType >= ParenParseOption::CompoundLiteral &&
              isTypeIdInParens(isAmbiguousTypeId)) {
 
     // Otherwise, this is a compound literal expression or cast expression.
@@ -3233,7 +3235,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
       ColonProtection.restore();
       RParenLoc = T.getCloseLocation();
       if (Tok.is(tok::l_brace)) {
-        ExprType = CompoundLiteral;
+        ExprType = ParenParseOption::CompoundLiteral;
         TypeResult Ty;
         {
           InMessageExpressionRAIIObject InMessage(*this, false);
@@ -3285,7 +3287,7 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
         }
       }
 
-      if (ExprType == CastExpr) {
+      if (ExprType == ParenParseOption::CastExpr) {
         // We parsed '(' type-name ')' and the thing after it wasn't a '{'.
 
         if (DeclaratorInfo.isInvalidType())
@@ -3331,9 +3333,9 @@ Parser::ParseParenExpression(ParenParseOption &ExprType, 
bool stopIfCastExpr,
       Diag(Tok, diag::err_expected_lbrace_in_compound_literal);
       return ExprError();
     }
-  } else if (ExprType >= FoldExpr && Tok.is(tok::ellipsis) &&
+  } else if (ExprType >= ParenParseOption::FoldExpr && Tok.is(tok::ellipsis) &&
              isFoldOperator(NextToken().getKind())) {
-    ExprType = FoldExpr;
+    ExprType = ParenParseOption::FoldExpr;
     return ParseFoldExpression(ExprResult(), T);
   } else if (isTypeCast) {
     // Parse the expression-list.
@@ -3343,18 +3345,18 @@ Parser::ParseParenExpression(ParenParseOption 
&ExprType, bool stopIfCastExpr,
     if (!ParseSimpleExpressionList(ArgExprs)) {
       // FIXME: If we ever support comma expressions as operands to
       // fold-expressions, we'll need to allow multiple ArgExprs here.
-      if (ExprType >= FoldExpr && ArgExprs.size() == 1 &&
+      if (ExprType >= ParenParseOption::FoldExpr && ArgExprs.size() == 1 &&
           isFoldOperator(Tok.getKind()) && NextToken().is(tok::ellipsis)) {
-        ExprType = FoldExpr;
+        ExprType = ParenParseOption::FoldExpr;
         return ParseFoldExpression(ArgExprs[0], T);
       }
 
-      ExprType = SimpleExpr;
+      ExprType = ParenParseOption::SimpleExpr;
       Result = Actions.ActOnParenListExpr(OpenLoc, Tok.getLocation(),
                                           ArgExprs);
     }
   } else if (getLangOpts().OpenMP >= 50 && OpenMPDirectiveParsing &&
-             ExprType == CastExpr && Tok.is(tok::l_square) &&
+             ExprType == ParenParseOption::CastExpr && Tok.is(tok::l_square) &&
              tryParseOpenMPArrayShapingCastPart()) {
     bool ErrorFound = false;
     SmallVector<Expr *, 4> OMPDimensions;
@@ -3395,12 +3397,12 @@ Parser::ParseParenExpression(ParenParseOption 
&ExprType, bool stopIfCastExpr,
       Result = Actions.CorrectDelayedTyposInExpr(Result);
     }
 
-    if (ExprType >= FoldExpr && isFoldOperator(Tok.getKind()) &&
-        NextToken().is(tok::ellipsis)) {
-      ExprType = FoldExpr;
+    if (ExprType >= ParenParseOption::FoldExpr &&
+        isFoldOperator(Tok.getKind()) && NextToken().is(tok::ellipsis)) {
+      ExprType = ParenParseOption::FoldExpr;
       return ParseFoldExpression(Result, T);
     }
-    ExprType = SimpleExpr;
+    ExprType = ParenParseOption::SimpleExpr;
 
     // Don't build a paren expression unless we actually match a ')'.
     if (!Result.isInvalid() && Tok.is(tok::r_paren))

diff  --git a/clang/lib/Parse/ParseExprCXX.cpp 
b/clang/lib/Parse/ParseExprCXX.cpp
index a11af84274dc1..de25fd50b43c1 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -4085,7 +4085,8 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
                                          BalancedDelimiterTracker &Tracker,
                                          ColonProtectionRAIIObject &ColonProt) 
{
   assert(getLangOpts().CPlusPlus && "Should only be called for C++!");
-  assert(ExprType == CastExpr && "Compound literals are not ambiguous!");
+  assert(ExprType == ParenParseOption::CastExpr &&
+         "Compound literals are not ambiguous!");
   assert(isTypeIdInParens() && "Not a type-id!");
 
   ExprResult Result(true);
@@ -4122,7 +4123,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
   }
 
   if (Tok.is(tok::l_brace)) {
-    ParseAs = CompoundLiteral;
+    ParseAs = ParenParseOption::CompoundLiteral;
   } else {
     bool NotCastExpr;
     if (Tok.is(tok::l_paren) && NextToken().is(tok::r_paren)) {
@@ -4140,7 +4141,8 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
 
     // If we parsed a cast-expression, it's really a type-id, otherwise it's
     // an expression.
-    ParseAs = NotCastExpr ? SimpleExpr : CastExpr;
+    ParseAs =
+        NotCastExpr ? ParenParseOption::SimpleExpr : 
ParenParseOption::CastExpr;
   }
 
   // Create a fake EOF to mark end of Toks buffer.
@@ -4161,7 +4163,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
   // as when we entered this function.
   ConsumeAnyToken();
 
-  if (ParseAs >= CompoundLiteral) {
+  if (ParseAs >= ParenParseOption::CompoundLiteral) {
     // Parse the type declarator.
     DeclSpec DS(AttrFactory);
     Declarator DeclaratorInfo(DS, ParsedAttributesView::none(),
@@ -4180,8 +4182,8 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
     assert(Tok.is(tok::eof) && Tok.getEofData() == AttrEnd.getEofData());
     ConsumeAnyToken();
 
-    if (ParseAs == CompoundLiteral) {
-      ExprType = CompoundLiteral;
+    if (ParseAs == ParenParseOption::CompoundLiteral) {
+      ExprType = ParenParseOption::CompoundLiteral;
       if (DeclaratorInfo.isInvalidType())
         return ExprError();
 
@@ -4192,7 +4194,7 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
     }
 
     // We parsed '(' type-id ')' and the thing after it wasn't a '{'.
-    assert(ParseAs == CastExpr);
+    assert(ParseAs == ParenParseOption::CastExpr);
 
     if (DeclaratorInfo.isInvalidType())
       return ExprError();
@@ -4206,9 +4208,9 @@ Parser::ParseCXXAmbiguousParenExpression(ParenParseOption 
&ExprType,
   }
 
   // Not a compound literal, and not followed by a cast-expression.
-  assert(ParseAs == SimpleExpr);
+  assert(ParseAs == ParenParseOption::SimpleExpr);
 
-  ExprType = SimpleExpr;
+  ExprType = ParenParseOption::SimpleExpr;
   Result = ParseExpression();
   if (!Result.isInvalid() && Tok.is(tok::r_paren))
     Result = Actions.ActOnParenExpr(Tracker.getOpenLocation(),

diff  --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 44d33a7d31ad6..183181fd3bac7 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -1712,7 +1712,7 @@ ExprResult Parser::ParseAsmStringLiteral(bool 
ForAsmLabel) {
     }
   } else if (!ForAsmLabel && getLangOpts().CPlusPlus11 &&
              Tok.is(tok::l_paren)) {
-    ParenParseOption ExprType = SimpleExpr;
+    ParenParseOption ExprType = ParenParseOption::SimpleExpr;
     SourceLocation RParenLoc;
     ParsedType CastTy;
 


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to