forked from OSchip/llvm-project
Clean up changes suggested by Douglas Gregor:
BuildObjCNumericLiteral() and BuildObjCBoxedExpr() now both using PerformCopyInitialization() rather than PerformImplicitConversion(), which suppresses errors. In BuildObjCBoxedExpr(): no longer calling .getCanonicalType(), ValueType->getAs() will remove the minimal amount of sugar. Using ValueType->isBuiltinType() instead of isa<BuiltinType>(ValueType). llvm-svn: 155949
This commit is contained in:
parent
afd3d0ba40
commit
2565c59631
|
@ -237,9 +237,6 @@ static ObjCMethodDecl *getNSNumberFactoryMethod(Sema &S, SourceLocation Loc,
|
|||
/// BuildObjCNumericLiteral - builds an ObjCBoxedExpr AST node for the
|
||||
/// numeric literal expression. Type of the expression will be "NSNumber *".
|
||||
ExprResult Sema::BuildObjCNumericLiteral(SourceLocation AtLoc, Expr *Number) {
|
||||
// compute the effective range of the literal, including the leading '@'.
|
||||
SourceRange SR(AtLoc, Number->getSourceRange().getEnd());
|
||||
|
||||
// Determine the type of the literal.
|
||||
QualType NumberType = Number->getType();
|
||||
if (CharacterLiteral *Char = dyn_cast<CharacterLiteral>(Number)) {
|
||||
|
@ -266,21 +263,27 @@ ExprResult Sema::BuildObjCNumericLiteral(SourceLocation AtLoc, Expr *Number) {
|
|||
|
||||
// Look for the appropriate method within NSNumber.
|
||||
// Construct the literal.
|
||||
SourceRange NR(Number->getSourceRange());
|
||||
ObjCMethodDecl *Method = getNSNumberFactoryMethod(*this, AtLoc, NumberType,
|
||||
true, Number->getSourceRange());
|
||||
true, NR);
|
||||
if (!Method)
|
||||
return ExprError();
|
||||
|
||||
// Convert the number to the type that the parameter expects.
|
||||
QualType ArgType = Method->param_begin()[0]->getType();
|
||||
ExprResult ConvertedNumber = PerformImplicitConversion(Number, ArgType,
|
||||
AA_Sending);
|
||||
ParmVarDecl *ParamDecl = Method->param_begin()[0];
|
||||
InitializedEntity Entity = InitializedEntity::InitializeParameter(Context,
|
||||
ParamDecl);
|
||||
ExprResult ConvertedNumber = PerformCopyInitialization(Entity,
|
||||
SourceLocation(),
|
||||
Owned(Number));
|
||||
if (ConvertedNumber.isInvalid())
|
||||
return ExprError();
|
||||
Number = ConvertedNumber.get();
|
||||
|
||||
// Use the effective source range of the literal, including the leading '@'.
|
||||
return MaybeBindToTemporary(
|
||||
new (Context) ObjCBoxedExpr(Number, NSNumberPointer, Method, SR));
|
||||
new (Context) ObjCBoxedExpr(Number, NSNumberPointer, Method,
|
||||
SourceRange(AtLoc, NR.getEnd())));
|
||||
}
|
||||
|
||||
ExprResult Sema::ActOnObjCBoolLiteral(SourceLocation AtLoc,
|
||||
|
@ -408,7 +411,7 @@ ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
|
|||
return ExprError();
|
||||
}
|
||||
ValueExpr = RValue.get();
|
||||
QualType ValueType(ValueExpr->getType().getCanonicalType());
|
||||
QualType ValueType(ValueExpr->getType());
|
||||
if (const PointerType *PT = ValueType->getAs<PointerType>()) {
|
||||
QualType PointeeType = PT->getPointeeType();
|
||||
if (Context.hasSameUnqualifiedType(PointeeType, Context.CharTy)) {
|
||||
|
@ -475,7 +478,7 @@ ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
|
|||
BoxingMethod = StringWithUTF8StringMethod;
|
||||
BoxedType = NSStringPointer;
|
||||
}
|
||||
} else if (isa<BuiltinType>(ValueType)) {
|
||||
} else if (ValueType->isBuiltinType()) {
|
||||
// The other types we support are numeric, char and BOOL/bool. We could also
|
||||
// provide limited support for structure types, such as NSRange, NSRect, and
|
||||
// NSSize. See NSValue (NSValueGeometryExtensions) in <Foundation/NSGeometry.h>
|
||||
|
@ -519,9 +522,12 @@ ExprResult Sema::BuildObjCBoxedExpr(SourceRange SR, Expr *ValueExpr) {
|
|||
}
|
||||
|
||||
// Convert the expression to the type that the parameter requires.
|
||||
QualType ArgType = BoxingMethod->param_begin()[0]->getType();
|
||||
ExprResult ConvertedValueExpr = PerformImplicitConversion(ValueExpr, ArgType,
|
||||
AA_Sending);
|
||||
ParmVarDecl *ParamDecl = BoxingMethod->param_begin()[0];
|
||||
InitializedEntity Entity = InitializedEntity::InitializeParameter(Context,
|
||||
ParamDecl);
|
||||
ExprResult ConvertedValueExpr = PerformCopyInitialization(Entity,
|
||||
SourceLocation(),
|
||||
Owned(ValueExpr));
|
||||
if (ConvertedValueExpr.isInvalid())
|
||||
return ExprError();
|
||||
ValueExpr = ConvertedValueExpr.get();
|
||||
|
|
Loading…
Reference in New Issue