Changeset View
Changeset View
Standalone View
Standalone View
cfe/trunk/lib/Sema/SemaExpr.cpp
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 5,878 Lines • ▼ Show 20 Lines | case Type::STK_ObjCObjectPointer: | ||||
case Type::STK_Bool: | case Type::STK_Bool: | ||||
return CK_PointerToBoolean; | return CK_PointerToBoolean; | ||||
case Type::STK_Integral: | case Type::STK_Integral: | ||||
return CK_PointerToIntegral; | return CK_PointerToIntegral; | ||||
case Type::STK_Floating: | case Type::STK_Floating: | ||||
case Type::STK_FloatingComplex: | case Type::STK_FloatingComplex: | ||||
case Type::STK_IntegralComplex: | case Type::STK_IntegralComplex: | ||||
case Type::STK_MemberPointer: | case Type::STK_MemberPointer: | ||||
case Type::STK_FixedPoint: | |||||
llvm_unreachable("illegal cast from pointer"); | llvm_unreachable("illegal cast from pointer"); | ||||
} | } | ||||
llvm_unreachable("Should have returned before this"); | llvm_unreachable("Should have returned before this"); | ||||
case Type::STK_FixedPoint: | |||||
switch (DestTy->getScalarTypeKind()) { | |||||
case Type::STK_FixedPoint: | |||||
return CK_FixedPointCast; | |||||
case Type::STK_Bool: | |||||
Diag(Src.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< DestTy; | |||||
return CK_IntegralToBoolean; | |||||
case Type::STK_Integral: | |||||
case Type::STK_Floating: | |||||
case Type::STK_IntegralComplex: | |||||
case Type::STK_FloatingComplex: | |||||
Diag(Src.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< DestTy; | |||||
return CK_IntegralCast; | |||||
case Type::STK_CPointer: | |||||
case Type::STK_ObjCObjectPointer: | |||||
case Type::STK_BlockPointer: | |||||
case Type::STK_MemberPointer: | |||||
llvm_unreachable("illegal cast to pointer type"); | |||||
} | |||||
llvm_unreachable("Should have returned before this"); | |||||
case Type::STK_Bool: // casting from bool is like casting from an integer | case Type::STK_Bool: // casting from bool is like casting from an integer | ||||
case Type::STK_Integral: | case Type::STK_Integral: | ||||
switch (DestTy->getScalarTypeKind()) { | switch (DestTy->getScalarTypeKind()) { | ||||
case Type::STK_CPointer: | case Type::STK_CPointer: | ||||
case Type::STK_ObjCObjectPointer: | case Type::STK_ObjCObjectPointer: | ||||
case Type::STK_BlockPointer: | case Type::STK_BlockPointer: | ||||
if (Src.get()->isNullPointerConstant(Context, | if (Src.get()->isNullPointerConstant(Context, | ||||
Expr::NPC_ValueDependentIsNull)) | Expr::NPC_ValueDependentIsNull)) | ||||
Show All 12 Lines | case Type::STK_IntegralComplex: | ||||
return CK_IntegralRealToComplex; | return CK_IntegralRealToComplex; | ||||
case Type::STK_FloatingComplex: | case Type::STK_FloatingComplex: | ||||
Src = ImpCastExprToType(Src.get(), | Src = ImpCastExprToType(Src.get(), | ||||
DestTy->castAs<ComplexType>()->getElementType(), | DestTy->castAs<ComplexType>()->getElementType(), | ||||
CK_IntegralToFloating); | CK_IntegralToFloating); | ||||
return CK_FloatingRealToComplex; | return CK_FloatingRealToComplex; | ||||
case Type::STK_MemberPointer: | case Type::STK_MemberPointer: | ||||
llvm_unreachable("member pointer type in C"); | llvm_unreachable("member pointer type in C"); | ||||
case Type::STK_FixedPoint: | |||||
Diag(Src.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< SrcTy; | |||||
return CK_IntegralCast; | |||||
} | } | ||||
llvm_unreachable("Should have returned before this"); | llvm_unreachable("Should have returned before this"); | ||||
case Type::STK_Floating: | case Type::STK_Floating: | ||||
switch (DestTy->getScalarTypeKind()) { | switch (DestTy->getScalarTypeKind()) { | ||||
case Type::STK_Floating: | case Type::STK_Floating: | ||||
return CK_FloatingCast; | return CK_FloatingCast; | ||||
case Type::STK_Bool: | case Type::STK_Bool: | ||||
Show All 11 Lines | case Type::STK_IntegralComplex: | ||||
CK_FloatingToIntegral); | CK_FloatingToIntegral); | ||||
return CK_IntegralRealToComplex; | return CK_IntegralRealToComplex; | ||||
case Type::STK_CPointer: | case Type::STK_CPointer: | ||||
case Type::STK_ObjCObjectPointer: | case Type::STK_ObjCObjectPointer: | ||||
case Type::STK_BlockPointer: | case Type::STK_BlockPointer: | ||||
llvm_unreachable("valid float->pointer cast?"); | llvm_unreachable("valid float->pointer cast?"); | ||||
case Type::STK_MemberPointer: | case Type::STK_MemberPointer: | ||||
llvm_unreachable("member pointer type in C"); | llvm_unreachable("member pointer type in C"); | ||||
case Type::STK_FixedPoint: | |||||
Diag(Src.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< SrcTy; | |||||
return CK_IntegralCast; | |||||
} | } | ||||
llvm_unreachable("Should have returned before this"); | llvm_unreachable("Should have returned before this"); | ||||
case Type::STK_FloatingComplex: | case Type::STK_FloatingComplex: | ||||
switch (DestTy->getScalarTypeKind()) { | switch (DestTy->getScalarTypeKind()) { | ||||
case Type::STK_FloatingComplex: | case Type::STK_FloatingComplex: | ||||
return CK_FloatingComplexCast; | return CK_FloatingComplexCast; | ||||
case Type::STK_IntegralComplex: | case Type::STK_IntegralComplex: | ||||
Show All 13 Lines | case Type::STK_Integral: | ||||
CK_FloatingComplexToReal); | CK_FloatingComplexToReal); | ||||
return CK_FloatingToIntegral; | return CK_FloatingToIntegral; | ||||
case Type::STK_CPointer: | case Type::STK_CPointer: | ||||
case Type::STK_ObjCObjectPointer: | case Type::STK_ObjCObjectPointer: | ||||
case Type::STK_BlockPointer: | case Type::STK_BlockPointer: | ||||
llvm_unreachable("valid complex float->pointer cast?"); | llvm_unreachable("valid complex float->pointer cast?"); | ||||
case Type::STK_MemberPointer: | case Type::STK_MemberPointer: | ||||
llvm_unreachable("member pointer type in C"); | llvm_unreachable("member pointer type in C"); | ||||
case Type::STK_FixedPoint: | |||||
Diag(Src.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< SrcTy; | |||||
return CK_IntegralCast; | |||||
} | } | ||||
llvm_unreachable("Should have returned before this"); | llvm_unreachable("Should have returned before this"); | ||||
case Type::STK_IntegralComplex: | case Type::STK_IntegralComplex: | ||||
switch (DestTy->getScalarTypeKind()) { | switch (DestTy->getScalarTypeKind()) { | ||||
case Type::STK_FloatingComplex: | case Type::STK_FloatingComplex: | ||||
return CK_IntegralComplexToFloatingComplex; | return CK_IntegralComplexToFloatingComplex; | ||||
case Type::STK_IntegralComplex: | case Type::STK_IntegralComplex: | ||||
Show All 13 Lines | case Type::STK_Floating: | ||||
CK_IntegralComplexToReal); | CK_IntegralComplexToReal); | ||||
return CK_IntegralToFloating; | return CK_IntegralToFloating; | ||||
case Type::STK_CPointer: | case Type::STK_CPointer: | ||||
case Type::STK_ObjCObjectPointer: | case Type::STK_ObjCObjectPointer: | ||||
case Type::STK_BlockPointer: | case Type::STK_BlockPointer: | ||||
llvm_unreachable("valid complex int->pointer cast?"); | llvm_unreachable("valid complex int->pointer cast?"); | ||||
case Type::STK_MemberPointer: | case Type::STK_MemberPointer: | ||||
llvm_unreachable("member pointer type in C"); | llvm_unreachable("member pointer type in C"); | ||||
case Type::STK_FixedPoint: | |||||
Diag(Src.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< SrcTy; | |||||
return CK_IntegralCast; | |||||
} | } | ||||
llvm_unreachable("Should have returned before this"); | llvm_unreachable("Should have returned before this"); | ||||
} | } | ||||
llvm_unreachable("Unhandled scalar cast"); | llvm_unreachable("Unhandled scalar cast"); | ||||
} | } | ||||
static bool breakDownVectorType(QualType type, uint64_t &len, | static bool breakDownVectorType(QualType type, uint64_t &len, | ||||
▲ Show 20 Lines • Show All 6,730 Lines • ▼ Show 20 Lines | case UO_LNot: // logical negation | ||||
if (resultType->isDependentType()) | if (resultType->isDependentType()) | ||||
break; | break; | ||||
if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) { | if (resultType->isScalarType() && !isScopedEnumerationType(resultType)) { | ||||
// C99 6.5.3.3p1: ok, fallthrough; | // C99 6.5.3.3p1: ok, fallthrough; | ||||
if (Context.getLangOpts().CPlusPlus) { | if (Context.getLangOpts().CPlusPlus) { | ||||
// C++03 [expr.unary.op]p8, C++0x [expr.unary.op]p9: | // C++03 [expr.unary.op]p8, C++0x [expr.unary.op]p9: | ||||
// operand contextually converted to bool. | // operand contextually converted to bool. | ||||
if (resultType->getScalarTypeKind() == Type::STK_FixedPoint) { | |||||
return ExprError( | |||||
Diag(Input.get()->getExprLoc(), | |||||
diag::err_unimplemented_conversion_with_fixed_point_type) | |||||
<< resultType); | |||||
} | |||||
Input = ImpCastExprToType(Input.get(), Context.BoolTy, | Input = ImpCastExprToType(Input.get(), Context.BoolTy, | ||||
ScalarTypeToBooleanCastKind(resultType)); | ScalarTypeToBooleanCastKind(resultType)); | ||||
} else if (Context.getLangOpts().OpenCL && | } else if (Context.getLangOpts().OpenCL && | ||||
Context.getLangOpts().OpenCLVersion < 120) { | Context.getLangOpts().OpenCLVersion < 120) { | ||||
// OpenCL v1.1 6.3.h: The logical operator not (!) does not | // OpenCL v1.1 6.3.h: The logical operator not (!) does not | ||||
// operate on scalar float types. | // operate on scalar float types. | ||||
if (!resultType->isIntegerType() && !resultType->isPointerType()) | if (!resultType->isIntegerType() && !resultType->isPointerType()) | ||||
return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) | return ExprError(Diag(OpLoc, diag::err_typecheck_unary_expr) | ||||
▲ Show 20 Lines • Show All 3,787 Lines • Show Last 20 Lines |