From 10f8e319569c8b8b4603d8a72ce01a7a01502c85 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Wed, 21 Jul 2010 18:31:47 +0000 Subject: [PATCH] Fix source location of the initializer in a copy initialization. Back out hack in objc rewriter. fixes radar 8213998. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@109024 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Rewrite/RewriteObjC.cpp | 8 -------- lib/Sema/SemaInit.cpp | 7 ++++--- lib/Sema/SemaInit.h | 2 ++ 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/lib/Rewrite/RewriteObjC.cpp b/lib/Rewrite/RewriteObjC.cpp index 2743a2bdc1..7c88d49c7b 100644 --- a/lib/Rewrite/RewriteObjC.cpp +++ b/lib/Rewrite/RewriteObjC.cpp @@ -5098,14 +5098,6 @@ void RewriteObjC::RewriteByRefVar(VarDecl *ND) { startLoc = E->getLocStart(); startLoc = SM->getInstantiationLoc(startLoc); endBuf = SM->getCharacterData(startLoc); - if (dyn_cast(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 += " = {(void*)"; ByrefType += utostr(isa); diff --git a/lib/Sema/SemaInit.cpp b/lib/Sema/SemaInit.cpp index 648780f306..0361f25913 100644 --- a/lib/Sema/SemaInit.cpp +++ b/lib/Sema/SemaInit.cpp @@ -3803,7 +3803,8 @@ InitializationSequence::Perform(Sema &S, // Build a call to the selected constructor. 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 // call. @@ -3819,11 +3820,11 @@ InitializationSequence::Perform(Sema &S, // An explicitly-constructed temporary, e.g., X(1, 2). unsigned NumExprs = ConstructorArgs.size(); Expr **Exprs = (Expr **)ConstructorArgs.take(); - S.MarkDeclarationReferenced(Kind.getLocation(), Constructor); + S.MarkDeclarationReferenced(Loc, Constructor); CurInit = S.Owned(new (S.Context) CXXTemporaryObjectExpr(S.Context, Constructor, Entity.getType(), - Kind.getLocation(), + Loc, Exprs, NumExprs, Kind.getParenRange().getEnd(), diff --git a/lib/Sema/SemaInit.h b/lib/Sema/SemaInit.h index 4c94aa6058..52481bb256 100644 --- a/lib/Sema/SemaInit.h +++ b/lib/Sema/SemaInit.h @@ -382,6 +382,8 @@ public: return Locations[1]; } + bool isCopyInit() const { return Kind == SIK_Copy; } + /// \brief Retrieve the source range containing the locations of the open /// and closing parentheses for value and direct initializations. SourceRange getParenRange() const { -- 2.40.0