From 6c2dc4d99392042a70dff89ee8cfa9594075709e Mon Sep 17 00:00:00 2001 From: Argyrios Kyrtzidis Date: Sat, 16 Aug 2008 20:27:34 +0000 Subject: [PATCH] Move the type checking that Sema::ActOnCastExpr does into a new Sema::CheckCastTypes function so that it can be reused. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@54852 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/Sema.h | 3 ++ lib/Sema/SemaExpr.cpp | 71 +++++++++++++++++++++++-------------------- 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/lib/Sema/Sema.h b/lib/Sema/Sema.h index 98f98aa353..ed01085897 100644 --- a/lib/Sema/Sema.h +++ b/lib/Sema/Sema.h @@ -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. diff --git a/lib/Sema/SemaExpr.cpp b/lib/Sema/SemaExpr.cpp index 58a126be6c..bb18a4a6db 100644 --- a/lib/Sema/SemaExpr.cpp +++ b/lib/Sema/SemaExpr.cpp @@ -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(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); } -- 2.40.0