diff options
author | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-08-27 08:41:06 +0200 |
---|---|---|
committer | Ivan Donchevskii <ivan.donchevskii@qt.io> | 2018-10-02 06:30:43 +0000 |
commit | 03b70d4fa4bd2e091608cbf954d5396c79c9cab2 (patch) | |
tree | 34394d987d0b3c9eacf3a39a717810f938e9aed9 | |
parent | c6835bf976098d6ea49a56292c89046a2caedcb1 (diff) |
[backported/clang-8][libclang] Return the proper pointee type for 'auto' deduced to pointer
--------------------------------------------------------------------------
* https://reviews.llvm.org/D51281
--------------------------------------------------------------------------
Currently the resulting type is always invalid in such case.
This is a cherry pick from commit 5d08e4bd09e184ec138fad141ca1fb2bca9e5091
Change-Id: Ic0c9be8c44905d286af38980e4dd65c51f64f0d9
Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
-rw-r--r-- | test/Index/print-type.cpp | 3 | ||||
-rw-r--r-- | tools/libclang/CXType.cpp | 7 |
2 files changed, 10 insertions, 0 deletions
diff --git a/test/Index/print-type.cpp b/test/Index/print-type.cpp index e152a7ed3d..3c76c97cca 100644 --- a/test/Index/print-type.cpp +++ b/test/Index/print-type.cpp @@ -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] diff --git a/tools/libclang/CXType.cpp b/tools/libclang/CXType.cpp index 7c0f307944..c3fdcc504f 100644 --- a/tools/libclang/CXType.cpp +++ b/tools/libclang/CXType.cpp @@ -437,6 +437,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(); @@ -454,6 +455,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; |