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:
Douglas Gregor 2009-08-26 14:37:04 +00:00
Родитель 91a2886d55
Коммит 47e1f7c68b
6 изменённых файлов: 23 добавлений и 10 удалений

Просмотреть файл

@ -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));
}