Improve source-location information for CXXConstructExpr nodes, by

ensuring that they cover all of their child nodes. There's still a
clang_getCursor()-related issue with CXXFunctionalCastExprs with
CXXConstructExprs as children (see FIXME in the test case); I'll look
at that separately.

llvm-svn: 118132
This commit is contained in:
Douglas Gregor 2010-11-03 00:35:38 +00:00
parent 3e6c919469
commit 15417cfa56
4 changed files with 77 additions and 5 deletions

View File

@ -347,9 +347,22 @@ StmtIterator DependentScopeDeclRefExpr::child_end() {
}
SourceRange CXXConstructExpr::getSourceRange() const {
return ParenRange.isValid() ?
SourceRange(Loc, ParenRange.getEnd()) :
SourceRange(Loc);
if (ParenRange.isValid())
return SourceRange(Loc, ParenRange.getEnd());
SourceLocation End = Loc;
for (unsigned I = getNumArgs(); I > 0; --I) {
const Expr *Arg = getArg(I-1);
if (!Arg->isDefaultArgument()) {
SourceLocation NewEnd = Arg->getLocEnd();
if (NewEnd.isValid()) {
End = NewEnd;
break;
}
}
}
return SourceRange(Loc, End);
}
SourceRange CXXOperatorCallExpr::getSourceRange() const {

View File

@ -4032,7 +4032,9 @@ bool Sema::CheckCastTypes(SourceRange TyR, QualType castType, Expr *&castExpr,
CXXCastPath &BasePath,
bool FunctionalStyle) {
if (getLangOptions().CPlusPlus)
return CXXCheckCStyleCast(TyR, castType, castExpr, Kind, BasePath,
return CXXCheckCStyleCast(SourceRange(TyR.getBegin(),
castExpr->getLocEnd()),
castType, castExpr, Kind, BasePath,
FunctionalStyle);
DefaultFunctionArrayLvalueConversion(castExpr);

View File

@ -0,0 +1,30 @@
// Test is line- and column-sensitive. Run lines are below.
struct X {
X();
X(int);
X(int, int);
X(const X&);
};
X getX(int value) {
switch (value) {
case 1: return X(value);
case 2: return X(value, value);
case 3: return (X)value;
default: break;
}
return X();
}
// RUN: c-index-test -cursor-at=%s:12:20 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
// RUN: c-index-test -cursor-at=%s:13:21 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
// RUN: c-index-test -cursor-at=%s:13:28 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
// RUN: c-index-test -cursor-at=%s:14:23 %s | FileCheck -check-prefix=CHECK-VALUE-REF %s
// CHECK-VALUE-REF: DeclRefExpr=value:10:12
// FIXME: c-index-test -cursor-at=%s:12:18 %s | FileCheck -check-prefix=CHECK-TYPE-REF %s
// RUN: c-index-test -cursor-at=%s:13:18 %s | FileCheck -check-prefix=CHECK-TYPE-REF %s
// FIXME: c-index-test -cursor-at=%s:14:19 %s | FileCheck -check-prefix=CHECK-TYPE-REF %s
// RUN: c-index-test -cursor-at=%s:17:10 %s | FileCheck -check-prefix=CHECK-TYPE-REF %s
// CHECK-TYPE-REF: TypeRef=struct X:3:8

View File

@ -1748,7 +1748,8 @@ bool CursorVisitor::VisitCXXUuidofExpr(CXXUuidofExpr *E) {
bool CursorVisitor::VisitCXXTemporaryObjectExpr(CXXTemporaryObjectExpr *E) {
if (TypeSourceInfo *TSInfo = E->getTypeSourceInfo())
return Visit(TSInfo->getTypeLoc());
if (Visit(TSInfo->getTypeLoc()))
return true;
return VisitExpr(E);
}
@ -2849,6 +2850,7 @@ CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
if (SLoc.isInvalid())
return clang_getNullCursor();
bool Logging = getenv("LIBCLANG_LOGGING");
SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
CXXUnit->getASTContext().getLangOptions());
@ -2862,6 +2864,31 @@ CXCursor clang_getCursor(CXTranslationUnit TU, CXSourceLocation Loc) {
Decl::MaxPCHLevel, SourceLocation(SLoc));
CursorVis.VisitChildren(Parent);
}
if (Logging) {
CXFile SearchFile;
unsigned SearchLine, SearchColumn;
CXFile ResultFile;
unsigned ResultLine, ResultColumn;
CXString SearchFileName, ResultFileName, KindSpelling;
CXSourceLocation ResultLoc = clang_getCursorLocation(Result);
clang_getInstantiationLocation(Loc, &SearchFile, &SearchLine, &SearchColumn,
0);
clang_getInstantiationLocation(ResultLoc, &ResultFile, &ResultLine,
&ResultColumn, 0);
SearchFileName = clang_getFileName(SearchFile);
ResultFileName = clang_getFileName(ResultFile);
KindSpelling = clang_getCursorKindSpelling(Result.kind);
fprintf(stderr, "clang_getCursor(%s:%d:%d) = %s(%s:%d:%d)\n",
clang_getCString(SearchFileName), SearchLine, SearchColumn,
clang_getCString(KindSpelling),
clang_getCString(ResultFileName), ResultLine, ResultColumn);
clang_disposeString(SearchFileName);
clang_disposeString(ResultFileName);
clang_disposeString(KindSpelling);
}
return Result;
}