Author: yvvan
Date: Fri Sep  7 06:23:51 2018
New Revision: 341656

URL: http://llvm.org/viewvc/llvm-project?rev=341656&view=rev
Log:
[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

Modified:
    cfe/trunk/test/Index/print-type.cpp
    cfe/trunk/tools/libclang/CXType.cpp

Modified: cfe/trunk/test/Index/print-type.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/print-type.cpp?rev=341656&r1=341655&r2=341656&view=diff
==============================================================================
--- cfe/trunk/test/Index/print-type.cpp (original)
+++ cfe/trunk/test/Index/print-type.cpp Fri Sep  7 06:23:51 2018
@@ -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]

Modified: cfe/trunk/tools/libclang/CXType.cpp
URL: 
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/libclang/CXType.cpp?rev=341656&r1=341655&r2=341656&view=diff
==============================================================================
--- cfe/trunk/tools/libclang/CXType.cpp (original)
+++ cfe/trunk/tools/libclang/CXType.cpp Fri Sep  7 06:23:51 2018
@@ -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;


_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to