[cfe-commits] r118132 - in /cfe/trunk: lib/AST/ExprCXX.cpp lib/Sema/SemaExpr.cpp test/Index/get-cursor.cpp tools/libclang/CIndex.cpp
Douglas Gregor
dgregor at apple.com
Tue Nov 2 17:35:38 PDT 2010
Author: dgregor
Date: Tue Nov 2 19:35:38 2010
New Revision: 118132
URL: http://llvm.org/viewvc/llvm-project?rev=118132&view=rev
Log:
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.
Added:
cfe/trunk/test/Index/get-cursor.cpp
Modified:
cfe/trunk/lib/AST/ExprCXX.cpp
cfe/trunk/lib/Sema/SemaExpr.cpp
cfe/trunk/tools/libclang/CIndex.cpp
Modified: cfe/trunk/lib/AST/ExprCXX.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=118132&r1=118131&r2=118132&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprCXX.cpp (original)
+++ cfe/trunk/lib/AST/ExprCXX.cpp Tue Nov 2 19:35:38 2010
@@ -347,9 +347,22 @@
}
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 {
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=118132&r1=118131&r2=118132&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Nov 2 19:35:38 2010
@@ -4032,7 +4032,9 @@
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);
Added: cfe/trunk/test/Index/get-cursor.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/get-cursor.cpp?rev=118132&view=auto
==============================================================================
--- cfe/trunk/test/Index/get-cursor.cpp (added)
+++ cfe/trunk/test/Index/get-cursor.cpp Tue Nov 2 19:35:38 2010
@@ -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
Modified: cfe/trunk/tools/libclang/CIndex.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CIndex.cpp?rev=118132&r1=118131&r2=118132&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CIndex.cpp (original)
+++ cfe/trunk/tools/libclang/CIndex.cpp Tue Nov 2 19:35:38 2010
@@ -1748,7 +1748,8 @@
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 @@
if (SLoc.isInvalid())
return clang_getNullCursor();
+ bool Logging = getenv("LIBCLANG_LOGGING");
SLoc = Lexer::GetBeginningOfToken(SLoc, CXXUnit->getSourceManager(),
CXXUnit->getASTContext().getLangOptions());
@@ -2862,6 +2864,31 @@
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;
}
More information about the cfe-commits
mailing list