зеркало из https://github.com/microsoft/clang-1.git
Source location information for ? and : in a ConditionalOperator, from Enea Zaffanella
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@80097 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
91a2886d55
Коммит
47e1f7c68b
|
@ -1546,8 +1546,10 @@ public:
|
|||
class ConditionalOperator : public Expr {
|
||||
enum { COND, LHS, RHS, END_EXPR };
|
||||
Stmt* SubExprs[END_EXPR]; // Left/Middle/Right hand sides.
|
||||
SourceLocation QuestionLoc, ColonLoc;
|
||||
public:
|
||||
ConditionalOperator(Expr *cond, Expr *lhs, Expr *rhs, QualType t)
|
||||
ConditionalOperator(Expr *cond, SourceLocation QLoc, Expr *lhs,
|
||||
SourceLocation CLoc, Expr *rhs, QualType t)
|
||||
: Expr(ConditionalOperatorClass, t,
|
||||
// FIXME: the type of the conditional operator doesn't
|
||||
// depend on the type of the conditional, but the standard
|
||||
|
@ -1555,7 +1557,9 @@ public:
|
|||
((lhs && lhs->isTypeDependent()) || (rhs && rhs->isTypeDependent())),
|
||||
(cond->isValueDependent() ||
|
||||
(lhs && lhs->isValueDependent()) ||
|
||||
(rhs && rhs->isValueDependent()))) {
|
||||
(rhs && rhs->isValueDependent()))),
|
||||
QuestionLoc(QLoc),
|
||||
ColonLoc(CLoc) {
|
||||
SubExprs[COND] = cond;
|
||||
SubExprs[LHS] = lhs;
|
||||
SubExprs[RHS] = rhs;
|
||||
|
@ -1590,6 +1594,12 @@ public:
|
|||
Expr *getRHS() const { return cast<Expr>(SubExprs[RHS]); }
|
||||
void setRHS(Expr *E) { SubExprs[RHS] = E; }
|
||||
|
||||
SourceLocation getQuestionLoc() const { return QuestionLoc; }
|
||||
void setQuestionLoc(SourceLocation L) { QuestionLoc = L; }
|
||||
|
||||
SourceLocation getColonLoc() const { return ColonLoc; }
|
||||
void setColonLoc(SourceLocation L) { ColonLoc = L; }
|
||||
|
||||
virtual SourceRange getSourceRange() const {
|
||||
return SourceRange(getCond()->getLocStart(), getRHS()->getLocEnd());
|
||||
}
|
||||
|
|
|
@ -491,6 +491,8 @@ unsigned PCHStmtReader::VisitConditionalOperator(ConditionalOperator *E) {
|
|||
E->setCond(cast<Expr>(StmtStack[StmtStack.size() - 3]));
|
||||
E->setLHS(cast_or_null<Expr>(StmtStack[StmtStack.size() - 2]));
|
||||
E->setRHS(cast_or_null<Expr>(StmtStack[StmtStack.size() - 1]));
|
||||
E->setQuestionLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
E->setColonLoc(SourceLocation::getFromRawEncoding(Record[Idx++]));
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
|
|
@ -453,6 +453,8 @@ void PCHStmtWriter::VisitConditionalOperator(ConditionalOperator *E) {
|
|||
Writer.WriteSubStmt(E->getCond());
|
||||
Writer.WriteSubStmt(E->getLHS());
|
||||
Writer.WriteSubStmt(E->getRHS());
|
||||
Writer.AddSourceLocation(E->getQuestionLoc(), Record);
|
||||
Writer.AddSourceLocation(E->getColonLoc(), Record);
|
||||
Code = pch::EXPR_CONDITIONAL_OPERATOR;
|
||||
}
|
||||
|
||||
|
|
|
@ -2591,7 +2591,9 @@ Stmt *RewriteObjC::SynthMessageExpr(ObjCMessageExpr *Exp) {
|
|||
SourceLocation());
|
||||
// (sizeof(returnType) <= 8 ? objc_msgSend(...) : objc_msgSend_stret(...))
|
||||
ConditionalOperator *CondExpr =
|
||||
new (Context) ConditionalOperator(lessThanExpr, CE, STCE, returnType);
|
||||
new (Context) ConditionalOperator(lessThanExpr,
|
||||
SourceLocation(), CE,
|
||||
SourceLocation(), STCE, returnType);
|
||||
ReplacingStmt = new (Context) ParenExpr(SourceLocation(), SourceLocation(), CondExpr);
|
||||
}
|
||||
// delete Exp; leak for now, see RewritePropertySetter() usage for more info.
|
||||
|
|
|
@ -3387,9 +3387,9 @@ Action::OwningExprResult Sema::ActOnConditionalOp(SourceLocation QuestionLoc,
|
|||
Cond.release();
|
||||
LHS.release();
|
||||
RHS.release();
|
||||
return Owned(new (Context) ConditionalOperator(CondExpr,
|
||||
return Owned(new (Context) ConditionalOperator(CondExpr, QuestionLoc,
|
||||
isLHSNull ? 0 : LHSExpr,
|
||||
RHSExpr, result));
|
||||
ColonLoc, RHSExpr, result));
|
||||
}
|
||||
|
||||
// CheckPointerTypesForAssignment - This is a very tricky routine (despite
|
||||
|
|
|
@ -3023,13 +3023,10 @@ TreeTransform<Derived>::TransformConditionalOperator(ConditionalOperator *E) {
|
|||
RHS.get() == E->getRHS())
|
||||
return SemaRef.Owned(E->Retain());
|
||||
|
||||
// FIXM: ? and : locations are broken.
|
||||
SourceLocation FakeQuestionLoc = E->getCond()->getLocEnd();
|
||||
SourceLocation FakeColonLoc = E->getFalseExpr()->getLocStart();
|
||||
return getDerived().RebuildConditionalOperator(move(Cond),
|
||||
FakeQuestionLoc,
|
||||
E->getQuestionLoc(),
|
||||
move(LHS),
|
||||
FakeColonLoc,
|
||||
E->getColonLoc(),
|
||||
move(RHS));
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче