[libclang] Fix the type of 'int (Foo);'
libclang exposes the type of 'int (Foo);' (a global variable of type int called Foo) as CXType_Unexposed. This is because Clang represents Foo's type as ParenType{BuiltinType{Int}}, and libclang does not handle ParenType. Make libclang return CXType_Int as the type of 'int (Foo);' by unwrapping ParenType transparently. Patch by Matt Glazar. Differential Revision: https://reviews.llvm.org/D45713 llvm-svn: 331306
This commit is contained in:
parent
c4cf3daad8
commit
82415e2614
|
@ -0,0 +1,16 @@
|
||||||
|
// RUN: c-index-test -test-print-type %s | FileCheck --check-prefix=CHECK-TYPE %s
|
||||||
|
// RUN: c-index-test -test-print-type-declaration %s | FileCheck --check-prefix=CHECK-TYPEDECL %s
|
||||||
|
|
||||||
|
// CHECK-TYPE: VarDecl=VariableWithParentheses:
|
||||||
|
// CHECK-TYPE-SAME: [type=int] [typekind=Int]
|
||||||
|
// CHECK-TYPE-NOT: canonicaltype
|
||||||
|
// CHECK-TYPE-SAME: isPOD
|
||||||
|
extern int (VariableWithParentheses);
|
||||||
|
|
||||||
|
typedef int MyTypedef;
|
||||||
|
// CHECK-TYPE: VarDecl=VariableWithParentheses2:
|
||||||
|
// CHECK-TYPE-SAME: [type=MyTypedef] [typekind=Typedef]
|
||||||
|
// CHECK-TYPE-SAME: [canonicaltype=int] [canonicaltypekind=Int]
|
||||||
|
// CHECK-TYPEDECL: VarDecl=VariableWithParentheses2
|
||||||
|
// CHECK-TYPEDECL-SAME: [typedeclaration=MyTypedef] [typekind=Typedef]
|
||||||
|
extern MyTypedef (VariableWithParentheses2);
|
|
@ -23,11 +23,11 @@ struct Struct{}; struct Struct elaboratedStructType();
|
||||||
// CHECK: TypeRef=FooType:1:13 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
|
// CHECK: TypeRef=FooType:1:13 [type=FooType] [typekind=Typedef] [canonicaltype=int] [canonicaltypekind=Int] [isPOD=1]
|
||||||
// CHECK: ParmDecl=arr:3:40 (Definition) [type=int [5]] [typekind=ConstantArray] [isPOD=1]
|
// CHECK: ParmDecl=arr:3:40 (Definition) [type=int [5]] [typekind=ConstantArray] [isPOD=1]
|
||||||
// CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1]
|
// CHECK: IntegerLiteral= [type=int] [typekind=Int] [isPOD=1]
|
||||||
// CHECK: ParmDecl=fn:3:55 (Definition) [type=void (*)(int)] [typekind=Pointer] [canonicaltype=void (*)(int)] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=void (int)] [pointeekind=Unexposed]
|
// CHECK: ParmDecl=fn:3:55 (Definition) [type=void (*)(int)] [typekind=Pointer] [canonicaltype=void (*)(int)] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=void (int)] [pointeekind=FunctionProto]
|
||||||
// CHECK: ParmDecl=:3:62 (Definition) [type=int] [typekind=Int] [isPOD=1]
|
// CHECK: ParmDecl=:3:62 (Definition) [type=int] [typekind=Int] [isPOD=1]
|
||||||
// CHECK: CompoundStmt= [type=] [typekind=Invalid] [isPOD=0]
|
// CHECK: CompoundStmt= [type=] [typekind=Invalid] [isPOD=0]
|
||||||
// CHECK: CallExpr=fn:3:55 [type=void] [typekind=Void] [args= [int] [Int]] [isPOD=0]
|
// CHECK: CallExpr=fn:3:55 [type=void] [typekind=Void] [args= [int] [Int]] [isPOD=0]
|
||||||
// CHECK: DeclRefExpr=fn:3:55 [type=void (*)(int)] [typekind=Pointer] [canonicaltype=void (*)(int)] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=void (int)] [pointeekind=Unexposed]
|
// CHECK: DeclRefExpr=fn:3:55 [type=void (*)(int)] [typekind=Pointer] [canonicaltype=void (*)(int)] [canonicaltypekind=Pointer] [isPOD=1] [pointeetype=void (int)] [pointeekind=FunctionProto]
|
||||||
// CHECK: UnaryOperator= [type=int] [typekind=Int] [isPOD=1]
|
// CHECK: UnaryOperator= [type=int] [typekind=Int] [isPOD=1]
|
||||||
// CHECK: DeclRefExpr=p:3:13 [type=int *] [typekind=Pointer] [isPOD=1] [pointeetype=int] [pointeekind=Int]
|
// CHECK: DeclRefExpr=p:3:13 [type=int *] [typekind=Pointer] [isPOD=1] [pointeetype=int] [pointeekind=Int]
|
||||||
// CHECK: DeclStmt= [type=] [typekind=Invalid] [isPOD=0]
|
// CHECK: DeclStmt= [type=] [typekind=Invalid] [isPOD=0]
|
||||||
|
|
|
@ -119,6 +119,10 @@ CXType cxtype::MakeCXType(QualType T, CXTranslationUnit TU) {
|
||||||
if (auto *ATT = T->getAs<AttributedType>()) {
|
if (auto *ATT = T->getAs<AttributedType>()) {
|
||||||
return MakeCXType(ATT->getModifiedType(), TU);
|
return MakeCXType(ATT->getModifiedType(), TU);
|
||||||
}
|
}
|
||||||
|
// Handle paren types as the original type
|
||||||
|
if (auto *PTT = T->getAs<ParenType>()) {
|
||||||
|
return MakeCXType(PTT->getInnerType(), TU);
|
||||||
|
}
|
||||||
|
|
||||||
ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
|
ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
|
||||||
if (Ctx.getLangOpts().ObjC1) {
|
if (Ctx.getLangOpts().ObjC1) {
|
||||||
|
|
Loading…
Reference in New Issue