]> granicus.if.org Git - clang/commitdiff
Move the type checking that Sema::ActOnCastExpr does into a new Sema::CheckCastTypes...
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 16 Aug 2008 20:27:34 +0000 (20:27 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 16 Aug 2008 20:27:34 +0000 (20:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54852 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/Sema.h
lib/Sema/SemaExpr.cpp

index 98f98aa353600e6953b76c50889f6a7273b22630..ed0108589743f011b4d4da64464ab18d1cd2db62 100644 (file)
@@ -869,6 +869,9 @@ private:
   
   StringLiteral *IsStringLiteralInit(Expr *Init, QualType DeclType);
   bool CheckStringLiteralInit(StringLiteral *strLiteral, QualType &DeclT);
+
+  /// CheckCastTypes - Check type constraints for casting between types.
+  bool CheckCastTypes(SourceRange TyRange, QualType CastTy, Expr *CastExpr);
   
   // CheckVectorCast - check type constraints for vectors. 
   // Since vectors are an extension, there are no C standard reference for this.
index 58a126be6c165ae91f4cdf37d1f8964460b01a2a..bb18a4a6db346eb48728dad92744193c0839bd0d 100644 (file)
@@ -1088,6 +1088,42 @@ ActOnInitList(SourceLocation LBraceLoc, ExprTy **initlist, unsigned NumInit,
   return E;
 }
 
+/// CheckCastTypes - Check type constraints for casting between types.
+bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *castExpr) {
+  UsualUnaryConversions(castExpr);
+
+  // C99 6.5.4p2: the cast type needs to be void or scalar and the expression
+  // type needs to be scalar.
+  if (castType->isVoidType()) {
+    // Cast to void allows any expr type.
+  } else if (!castType->isScalarType() && !castType->isVectorType()) {
+    // GCC struct/union extension: allow cast to self.
+    if (Context.getCanonicalType(castType) !=
+        Context.getCanonicalType(castExpr->getType()) ||
+        (!castType->isStructureType() && !castType->isUnionType())) {
+      // Reject any other conversions to non-scalar types.
+      return Diag(TyR.getBegin(), diag::err_typecheck_cond_expect_scalar, 
+                  castType.getAsString(), castExpr->getSourceRange());
+    }
+      
+    // accept this, but emit an ext-warn.
+    Diag(TyR.getBegin(), diag::ext_typecheck_cast_nonscalar, 
+         castType.getAsString(), castExpr->getSourceRange());
+  } else if (!castExpr->getType()->isScalarType() && 
+             !castExpr->getType()->isVectorType()) {
+    return Diag(castExpr->getLocStart(), 
+                diag::err_typecheck_expect_scalar_operand, 
+                castExpr->getType().getAsString(),castExpr->getSourceRange());
+  } else if (castExpr->getType()->isVectorType()) {
+    if (CheckVectorCast(TyR, castExpr->getType(), castType))
+      return true;
+  } else if (castType->isVectorType()) {
+    if (CheckVectorCast(TyR, castType, castExpr->getType()))
+      return true;
+  }
+  return false;
+}
+
 bool Sema::CheckVectorCast(SourceRange R, QualType VectorTy, QualType Ty) {
   assert(VectorTy->isVectorType() && "Not a vector type!");
   
@@ -1116,39 +1152,8 @@ ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
   Expr *castExpr = static_cast<Expr*>(Op);
   QualType castType = QualType::getFromOpaquePtr(Ty);
 
-  UsualUnaryConversions(castExpr);
-
-  // C99 6.5.4p2: the cast type needs to be void or scalar and the expression
-  // type needs to be scalar.
-  if (castType->isVoidType()) {
-    // Cast to void allows any expr type.
-  } else if (!castType->isScalarType() && !castType->isVectorType()) {
-    // GCC struct/union extension: allow cast to self.
-    if (Context.getCanonicalType(castType) !=
-        Context.getCanonicalType(castExpr->getType()) ||
-        (!castType->isStructureType() && !castType->isUnionType())) {
-      // Reject any other conversions to non-scalar types.
-      return Diag(LParenLoc, diag::err_typecheck_cond_expect_scalar, 
-                  castType.getAsString(), castExpr->getSourceRange());
-    }
-      
-    // accept this, but emit an ext-warn.
-    Diag(LParenLoc, diag::ext_typecheck_cast_nonscalar, 
-         castType.getAsString(), castExpr->getSourceRange());
-  } else if (!castExpr->getType()->isScalarType() && 
-             !castExpr->getType()->isVectorType()) {
-    return Diag(castExpr->getLocStart(), 
-                diag::err_typecheck_expect_scalar_operand, 
-                castExpr->getType().getAsString(),castExpr->getSourceRange());
-  } else if (castExpr->getType()->isVectorType()) {
-    if (CheckVectorCast(SourceRange(LParenLoc, RParenLoc), 
-                        castExpr->getType(), castType))
-      return true;
-  } else if (castType->isVectorType()) {
-    if (CheckVectorCast(SourceRange(LParenLoc, RParenLoc), 
-                        castType, castExpr->getType()))
-      return true;
-  }
+  if (CheckCastTypes(SourceRange(LParenLoc, RParenLoc), castType, castExpr))
+    return true;
   return new CastExpr(castType, castExpr, LParenLoc);
 }