[libclang] Annotation of parameters that got default args from a previous declarations was

broken because the end location of the parameter was the end location of the default arg,
resulting in a source range that could begin in one file and end in another.

llvm-svn: 136572
This commit is contained in:
Argyrios Kyrtzidis 2011-07-30 17:23:26 +00:00
parent eb5ea833ed
commit 4c6efa62e0
4 changed files with 31 additions and 0 deletions

View File

@ -1198,6 +1198,8 @@ public:
StorageClass S, StorageClass SCAsWritten,
Expr *DefArg);
virtual SourceRange getSourceRange() const;
void setObjCMethodScopeInfo(unsigned parameterIndex) {
ParmVarDeclBits.IsObjCMethodParam = true;

View File

@ -1388,6 +1388,16 @@ ParmVarDecl *ParmVarDecl::Create(ASTContext &C, DeclContext *DC,
S, SCAsWritten, DefArg);
}
SourceRange ParmVarDecl::getSourceRange() const {
if (!hasInheritedDefaultArg()) {
SourceRange ArgRange = getDefaultArgRange();
if (ArgRange.isValid())
return SourceRange(getOuterLocStart(), ArgRange.getEnd());
}
return DeclaratorDecl::getSourceRange();
}
Expr *ParmVarDecl::getDefaultArg() {
assert(!hasUnparsedDefaultArg() && "Default argument is not yet parsed!");
assert(!hasUninstantiatedDefaultArg() &&

View File

@ -0,0 +1,16 @@
#include "annotate-tokens-with-default-args.h"
void Foo::m(Foo *f) {}
// RUN: c-index-test -test-annotate-tokens=%s:3:1:4:1 %s | FileCheck %s
// CHECK: Keyword: "void" [3:1 - 3:5] CXXMethod=m:3:11 (Definition)
// CHECK: Identifier: "Foo" [3:6 - 3:9] TypeRef=struct Foo:1:8
// CHECK: Punctuation: "::" [3:9 - 3:11] CXXMethod=m:3:11 (Definition)
// CHECK: Identifier: "m" [3:11 - 3:12] CXXMethod=m:3:11 (Definition)
// CHECK: Punctuation: "(" [3:12 - 3:13] CXXMethod=m:3:11 (Definition)
// CHECK: Identifier: "Foo" [3:13 - 3:16] TypeRef=struct Foo:1:8
// CHECK: Punctuation: "*" [3:17 - 3:18] ParmDecl=f:3:18 (Definition)
// CHECK: Identifier: "f" [3:18 - 3:19] ParmDecl=f:3:18 (Definition)
// CHECK: Punctuation: ")" [3:19 - 3:20] CXXMethod=m:3:11 (Definition)
// CHECK: Punctuation: "{" [3:21 - 3:22] UnexposedStmt=
// CHECK: Punctuation: "}" [3:22 - 3:23] UnexposedStmt=

View File

@ -0,0 +1,3 @@
struct Foo {
void m(Foo *f = 0);
};