Preserve source location information for qualified names used in a constructor

initializer list to name a base class. Patch by Shahms King!

llvm-svn: 255420
This commit is contained in:
Richard Smith 2015-12-12 02:17:54 +00:00
parent 9497cc2bf8
commit 97047d8cb6
2 changed files with 17 additions and 2 deletions

View File

@ -2980,10 +2980,15 @@ Sema::BuildMemInitializer(Decl *ConstructorD,
if (BaseType.isNull()) {
BaseType = Context.getTypeDeclType(TyD);
MarkAnyDeclReferenced(TyD->getLocation(), TyD, /*OdrUse=*/false);
if (SS.isSet())
// FIXME: preserve source range information
if (SS.isSet()) {
BaseType = Context.getElaboratedType(ETK_None, SS.getScopeRep(),
BaseType);
TInfo = Context.CreateTypeSourceInfo(BaseType);
ElaboratedTypeLoc TL = TInfo->getTypeLoc().castAs<ElaboratedTypeLoc>();
TL.getNamedTypeLoc().castAs<TypeSpecTypeLoc>().setNameLoc(IdLoc);
TL.setElaboratedKeywordLoc(SourceLocation());
TL.setQualifierLoc(SS.getWithLocInContext(Context));
}
}
}

View File

@ -0,0 +1,10 @@
namespace ns1 {
struct Base {};
struct Derived : Base {
Derived() : ns1::Base() {}
};
}
// RUN: c-index-test -test-load-source all %s | FileCheck %s
// CHECK: namespaced-base-ctor-init.cpp:4:15: NamespaceRef=ns1:1:11 Extent=[4:15 - 4:18]
// CHECK: namespaced-base-ctor-init.cpp:4:20: TypeRef=struct ns1::Base:2:8 Extent=[4:20 - 4:24]