Fix source location of the initializer in

a copy initialization. Back out hack in objc rewriter.
fixes radar 8213998.

llvm-svn: 109024
This commit is contained in:
Fariborz Jahanian 2010-07-21 18:31:47 +00:00
parent 45595cf99f
commit 3fd2a555d3
3 changed files with 6 additions and 11 deletions

View File

@ -5098,14 +5098,6 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) {
startLoc = E->getLocStart(); startLoc = E->getLocStart();
startLoc = SM->getInstantiationLoc(startLoc); startLoc = SM->getInstantiationLoc(startLoc);
endBuf = SM->getCharacterData(startLoc); endBuf = SM->getCharacterData(startLoc);
if (dyn_cast<CXXConstructExpr>(E)) {
// Hack alter!
// SemaInit sets startLoc to beginning of the initialized variable when
// rhs involvs copy construction initialization. Must compensate for this.
if (char *atEqual = strchr(endBuf, '='))
endBuf = atEqual + 1;
}
ByrefType += " " + Name; ByrefType += " " + Name;
ByrefType += " = {(void*)"; ByrefType += " = {(void*)";
ByrefType += utostr(isa); ByrefType += utostr(isa);

View File

@ -3803,7 +3803,8 @@ InitializationSequence::Perform(Sema &S,
// Build a call to the selected constructor. // Build a call to the selected constructor.
ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S); ASTOwningVector<&ActionBase::DeleteExpr> ConstructorArgs(S);
SourceLocation Loc = Kind.getLocation(); SourceLocation Loc = Kind.isCopyInit() ? Kind.getEqualLoc()
: Kind.getLocation();
// Determine the arguments required to actually perform the constructor // Determine the arguments required to actually perform the constructor
// call. // call.
@ -3819,11 +3820,11 @@ InitializationSequence::Perform(Sema &S,
// An explicitly-constructed temporary, e.g., X(1, 2). // An explicitly-constructed temporary, e.g., X(1, 2).
unsigned NumExprs = ConstructorArgs.size(); unsigned NumExprs = ConstructorArgs.size();
Expr **Exprs = (Expr **)ConstructorArgs.take(); Expr **Exprs = (Expr **)ConstructorArgs.take();
S.MarkDeclarationReferenced(Kind.getLocation(), Constructor); S.MarkDeclarationReferenced(Loc, Constructor);
CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context,
Constructor, Constructor,
Entity.getType(), Entity.getType(),
Kind.getLocation(), Loc,
Exprs, Exprs,
NumExprs, NumExprs,
Kind.getParenRange().getEnd(), Kind.getParenRange().getEnd(),

View File

@ -382,6 +382,8 @@ public:
return Locations[1]; return Locations[1];
} }
bool isCopyInit() const { return Kind == SIK_Copy; }
/// \brief Retrieve the source range containing the locations of the open /// \brief Retrieve the source range containing the locations of the open
/// and closing parentheses for value and direct initializations. /// and closing parentheses for value and direct initializations.
SourceRange getParenRange() const { SourceRange getParenRange() const {