]> granicus.if.org Git - clang/commitdiff
Convert the expression trait evaluation to a static function and
authorChandler Carruth <chandlerc@gmail.com>
Sun, 1 May 2011 07:44:20 +0000 (07:44 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Sun, 1 May 2011 07:44:20 +0000 (07:44 +0000)
a switch with any default case. This both warns when an enumerator is
missing and asserts if a value sneaks through despite the warning.

While in there fix a bunch of coding style issues with this code.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130648 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExprCXX.cpp

index 4d5074a13b7de1246b8e35a4421b59a6344177f7..acbe4154cafbdb8f90e942e1e268f4e4e48a1d63 100644 (file)
@@ -2751,7 +2751,6 @@ static bool EvaluateUnaryTypeTrait(Sema &Self, UnaryTypeTrait UTT,
   llvm_unreachable("Type trait not covered by switch");
 }
 
-
 ExprResult Sema::BuildUnaryTypeTrait(UnaryTypeTrait UTT,
                                      SourceLocation KWLoc,
                                      TypeSourceInfo *TSInfo,
@@ -3016,23 +3015,30 @@ ExprResult Sema::BuildArrayTypeTrait(ArrayTypeTrait ATT,
 }
 
 ExprResult Sema::ActOnExpressionTrait(ExpressionTrait ET,
-                                     SourceLocation KWLoc,
-                                     Expr* Queried,
-                                     SourceLocation RParen) {
+                                      SourceLocation KWLoc,
+                                      Expr *Queried,
+                                      SourceLocation RParen) {
   // If error parsing the expression, ignore.
   if (!Queried)
-      return ExprError();
+    return ExprError();
 
-  ExprResult Result
-    = BuildExpressionTrait(ET, KWLoc, Queried, RParen);
+  ExprResult Result = BuildExpressionTrait(ET, KWLoc, Queried, RParen);
 
   return move(Result);
 }
 
+static bool EvaluateExpressionTrait(ExpressionTrait ET, Expr *E) {
+  switch (ET) {
+  case ET_IsLValueExpr: return E->isLValue();
+  case ET_IsRValueExpr: return E->isRValue();
+  }
+  llvm_unreachable("Expression trait not covered by switch");
+}
+
 ExprResult Sema::BuildExpressionTrait(ExpressionTrait ET,
-                                     SourceLocation KWLoc,
-                                     Expr* Queried,
-                                     SourceLocation RParen) {
+                                      SourceLocation KWLoc,
+                                      Expr *Queried,
+                                      SourceLocation RParen) {
   if (Queried->isTypeDependent()) {
     // Delay type-checking for type-dependent expressions.
   } else if (Queried->getType()->isPlaceholderType()) {
@@ -3041,17 +3047,10 @@ ExprResult Sema::BuildExpressionTrait(ExpressionTrait ET,
     return BuildExpressionTrait(ET, KWLoc, PE.take(), RParen);
   }
 
-  bool Value = false;
-  switch (ET) {
-  default: llvm_unreachable("Unknown or unimplemented expression trait");
-  case ET_IsLValueExpr:       Value = Queried->isLValue(); break;
-  case ET_IsRValueExpr:       Value = Queried->isRValue(); break;
-  }
-  
+  bool Value = EvaluateExpressionTrait(ET, Queried);
   // C99 6.5.3.4p4: the type (an unsigned integer type) is size_t.
-  return Owned(
-      new (Context) ExpressionTraitExpr(
-          KWLoc, ET, Queried, Value, RParen, Context.BoolTy));
+  return Owned(new (Context) ExpressionTraitExpr(KWLoc, ET, Queried, Value,
+                                                 RParen, Context.BoolTy));
 }
 
 QualType Sema::CheckPointerToMemberOperands(ExprResult &lex, ExprResult &rex,