[libclang] Return the proper pointee type for 'auto' deduced to pointer
Currently the resulting type is always invalid in such case. Differential Revision: https://reviews.llvm.org/D51281 llvm-svn: 341656
This commit is contained in:
parent
8f060aac2f
commit
38bdf54b49
|
@ -75,6 +75,8 @@ template<typename T> struct A {};
|
|||
template<typename T> using C = T;
|
||||
using baz = C<A<void>>;
|
||||
|
||||
auto autoTemplPointer = &autoTemplRefParam;
|
||||
|
||||
// RUN: c-index-test -test-print-type %s -std=c++14 | FileCheck %s
|
||||
// CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
||||
// CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
||||
|
@ -182,3 +184,4 @@ using baz = C<A<void>>;
|
|||
// CHECK: UnexposedExpr=templRefParam:71:40 [type=const Specialization<Specialization<bool> &>] [typekind=Unexposed] const [templateargs/1= [type=Specialization<bool> &] [typekind=LValueReference]] [canonicaltype=const Specialization<Specialization<bool> &>] [canonicaltypekind=Record] [canonicaltemplateargs/1= [type=Specialization<bool> &] [typekind=LValueReference]] [isPOD=1]
|
||||
// CHECK: DeclRefExpr=templRefParam:71:40 [type=Specialization<Specialization<bool> &>] [typekind=Unexposed] [templateargs/1= [type=Specialization<bool> &] [typekind=LValueReference]] [canonicaltype=Specialization<Specialization<bool> &>] [canonicaltypekind=Record] [canonicaltemplateargs/1= [type=Specialization<bool> &] [typekind=LValueReference]] [isPOD=1]
|
||||
// CHECK: TypeAliasDecl=baz:76:7 (Definition) [type=baz] [typekind=Typedef] [templateargs/1= [type=A<void>] [typekind=Unexposed]] [canonicaltype=A<void>] [canonicaltypekind=Record] [canonicaltemplateargs/1= [type=void] [typekind=Void]] [isPOD=0]
|
||||
// CHECK: VarDecl=autoTemplPointer:78:6 (Definition) [type=Specialization<Specialization<bool> &> *] [typekind=Auto] [canonicaltype=Specialization<Specialization<bool> &> *] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=Specialization<Specialization<bool> &>] [pointeekind=Record]
|
||||
|
|
|
@ -442,6 +442,7 @@ CXType clang_getPointeeType(CXType CT) {
|
|||
if (!TP)
|
||||
return MakeCXType(QualType(), GetTU(CT));
|
||||
|
||||
try_again:
|
||||
switch (TP->getTypeClass()) {
|
||||
case Type::Pointer:
|
||||
T = cast<PointerType>(TP)->getPointeeType();
|
||||
|
@ -459,6 +460,12 @@ CXType clang_getPointeeType(CXType CT) {
|
|||
case Type::MemberPointer:
|
||||
T = cast<MemberPointerType>(TP)->getPointeeType();
|
||||
break;
|
||||
case Type::Auto:
|
||||
case Type::DeducedTemplateSpecialization:
|
||||
TP = cast<DeducedType>(TP)->getDeducedType().getTypePtrOrNull();
|
||||
if (TP)
|
||||
goto try_again;
|
||||
break;
|
||||
default:
|
||||
T = QualType();
|
||||
break;
|
||||
|
|
Loading…
Reference in New Issue