Allow for a GCC cast extension.
Fixes part of <rdar://problem/5980829> clang on xcode: used type 'NSRange' where arithmetic or pointer type is required. llvm-svn: 51900
This commit is contained in:
parent
2dd8fdc78a
commit
1ba306cde5
|
@ -922,6 +922,8 @@ DIAG(err_typecheck_cond_expect_scalar, ERROR,
|
|||
"used type '%0' where arithmetic or pointer type is required")
|
||||
DIAG(ext_typecheck_cond_one_void, EXTENSION,
|
||||
"C99 forbids conditional expressions with only one void side")
|
||||
DIAG(ext_typecheck_cast_nonscalar, EXTENSION,
|
||||
"C99 forbids casting nonscalar to the same type")
|
||||
DIAG(err_typecheck_expect_scalar_operand, ERROR,
|
||||
"operand of type '%0' where arithmetic or pointer type is required")
|
||||
DIAG(err_typecheck_cond_incompatible_operands, ERROR,
|
||||
|
|
|
@ -845,9 +845,16 @@ ActOnCastExpr(SourceLocation LParenLoc, TypeTy *Ty,
|
|||
// 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.
|
||||
if (!castType->isScalarType() && !castType->isVectorType())
|
||||
return Diag(LParenLoc, diag::err_typecheck_cond_expect_scalar,
|
||||
castType.getAsString(), SourceRange(LParenLoc, RParenLoc));
|
||||
if (!castType->isScalarType() && !castType->isVectorType()) {
|
||||
// GCC struct/union extension.
|
||||
if (castType == castExpr->getType() &&
|
||||
castType->isStructureType() || castType->isUnionType())
|
||||
return Diag(LParenLoc, diag::ext_typecheck_cast_nonscalar,
|
||||
SourceRange(LParenLoc, RParenLoc));
|
||||
else
|
||||
return Diag(LParenLoc, diag::err_typecheck_cond_expect_scalar,
|
||||
castType.getAsString(), SourceRange(LParenLoc, RParenLoc));
|
||||
}
|
||||
if (!castExpr->getType()->isScalarType() &&
|
||||
!castExpr->getType()->isVectorType())
|
||||
return Diag(castExpr->getLocStart(),
|
||||
|
|
Loading…
Reference in New Issue