forked from OSchip/llvm-project
[libclang] Introduce clang_Type_getClassType which returns the class type of a member pointer type.
Patch by Che-Liang Chiou! llvm-svn: 191906
This commit is contained in:
parent
0bf8241d4b
commit
7a4253b685
|
@ -1487,6 +1487,7 @@ TypeKind.VECTOR = TypeKind(113)
|
||||||
TypeKind.INCOMPLETEARRAY = TypeKind(114)
|
TypeKind.INCOMPLETEARRAY = TypeKind(114)
|
||||||
TypeKind.VARIABLEARRAY = TypeKind(115)
|
TypeKind.VARIABLEARRAY = TypeKind(115)
|
||||||
TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116)
|
TypeKind.DEPENDENTSIZEDARRAY = TypeKind(116)
|
||||||
|
TypeKind.MEMBERPOINTER = TypeKind(117)
|
||||||
|
|
||||||
class Type(Structure):
|
class Type(Structure):
|
||||||
"""
|
"""
|
||||||
|
@ -1662,6 +1663,12 @@ class Type(Structure):
|
||||||
"""
|
"""
|
||||||
return conf.lib.clang_getArraySize(self)
|
return conf.lib.clang_getArraySize(self)
|
||||||
|
|
||||||
|
def get_class_type(self):
|
||||||
|
"""
|
||||||
|
Retrieve the class type of the member pointer type.
|
||||||
|
"""
|
||||||
|
return conf.lib.clang_Type_getClassType(self)
|
||||||
|
|
||||||
def get_align(self):
|
def get_align(self):
|
||||||
"""
|
"""
|
||||||
Retrieve the alignment of the record.
|
Retrieve the alignment of the record.
|
||||||
|
@ -2694,6 +2701,11 @@ functionList = [
|
||||||
[Type],
|
[Type],
|
||||||
c_longlong),
|
c_longlong),
|
||||||
|
|
||||||
|
("clang_Type_getClassType",
|
||||||
|
[Type],
|
||||||
|
Type,
|
||||||
|
Type.from_result),
|
||||||
|
|
||||||
("clang_getFieldDeclBitWidth",
|
("clang_getFieldDeclBitWidth",
|
||||||
[Cursor],
|
[Cursor],
|
||||||
c_int),
|
c_int),
|
||||||
|
|
|
@ -2678,7 +2678,8 @@ enum CXTypeKind {
|
||||||
CXType_Vector = 113,
|
CXType_Vector = 113,
|
||||||
CXType_IncompleteArray = 114,
|
CXType_IncompleteArray = 114,
|
||||||
CXType_VariableArray = 115,
|
CXType_VariableArray = 115,
|
||||||
CXType_DependentSizedArray = 116
|
CXType_DependentSizedArray = 116,
|
||||||
|
CXType_MemberPointer = 117
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2968,6 +2969,13 @@ enum CXTypeLayoutError {
|
||||||
*/
|
*/
|
||||||
CINDEX_LINKAGE long long clang_Type_getAlignOf(CXType T);
|
CINDEX_LINKAGE long long clang_Type_getAlignOf(CXType T);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Return the class type of an member pointer type.
|
||||||
|
*
|
||||||
|
* If a non-member-pointer type is passed in, an invalid type is returned.
|
||||||
|
*/
|
||||||
|
CINDEX_LINKAGE CXType clang_Type_getClassType(CXType T);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief Return the size of a type in bytes as per C++[expr.sizeof] standard.
|
* \brief Return the size of a type in bytes as per C++[expr.sizeof] standard.
|
||||||
*
|
*
|
||||||
|
|
|
@ -34,6 +34,11 @@ T tbar(int[size]);
|
||||||
|
|
||||||
void foo(int i, int incomplete_array[]) { int variable_array[i]; }
|
void foo(int i, int incomplete_array[]) { int variable_array[i]; }
|
||||||
|
|
||||||
|
struct Blob {
|
||||||
|
int i;
|
||||||
|
};
|
||||||
|
int Blob::*member_pointer;
|
||||||
|
|
||||||
// RUN: c-index-test -test-print-type %s | FileCheck %s
|
// RUN: c-index-test -test-print-type %s | FileCheck %s
|
||||||
// CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
// CHECK: Namespace=outer:1:11 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
||||||
// CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
// CHECK: ClassTemplate=Foo:4:8 (Definition) [type=] [typekind=Invalid] [isPOD=0]
|
||||||
|
@ -73,3 +78,4 @@ void foo(int i, int incomplete_array[]) { int variable_array[i]; }
|
||||||
// CHECK: ParmDecl=:33:11 (Definition) [type=int [size]] [typekind=DependentSizedArray] [isPOD=0]
|
// CHECK: ParmDecl=:33:11 (Definition) [type=int [size]] [typekind=DependentSizedArray] [isPOD=0]
|
||||||
// CHECK: ParmDecl=incomplete_array:35:21 (Definition) [type=int []] [typekind=IncompleteArray] [isPOD=1]
|
// CHECK: ParmDecl=incomplete_array:35:21 (Definition) [type=int []] [typekind=IncompleteArray] [isPOD=1]
|
||||||
// CHECK: VarDecl=variable_array:35:47 (Definition) [type=int [i]] [typekind=VariableArray] [isPOD=1]
|
// CHECK: VarDecl=variable_array:35:47 (Definition) [type=int [i]] [typekind=VariableArray] [isPOD=1]
|
||||||
|
// CHECK: VarDecl=member_pointer:40:12 (Definition) [type=int Blob::*] [typekind=MemberPointer] [isPOD=1]
|
||||||
|
|
|
@ -89,6 +89,7 @@ static CXTypeKind GetTypeKind(QualType T) {
|
||||||
TKCASE(VariableArray);
|
TKCASE(VariableArray);
|
||||||
TKCASE(DependentSizedArray);
|
TKCASE(DependentSizedArray);
|
||||||
TKCASE(Vector);
|
TKCASE(Vector);
|
||||||
|
TKCASE(MemberPointer);
|
||||||
default:
|
default:
|
||||||
return CXType_Unexposed;
|
return CXType_Unexposed;
|
||||||
}
|
}
|
||||||
|
@ -365,6 +366,9 @@ CXType clang_getPointeeType(CXType CT) {
|
||||||
case Type::ObjCObjectPointer:
|
case Type::ObjCObjectPointer:
|
||||||
T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
|
T = cast<ObjCObjectPointerType>(TP)->getPointeeType();
|
||||||
break;
|
break;
|
||||||
|
case Type::MemberPointer:
|
||||||
|
T = cast<MemberPointerType>(TP)->getPointeeType();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
T = QualType();
|
T = QualType();
|
||||||
break;
|
break;
|
||||||
|
@ -478,6 +482,7 @@ CXString clang_getTypeKindSpelling(enum CXTypeKind K) {
|
||||||
TKIND(VariableArray);
|
TKIND(VariableArray);
|
||||||
TKIND(DependentSizedArray);
|
TKIND(DependentSizedArray);
|
||||||
TKIND(Vector);
|
TKIND(Vector);
|
||||||
|
TKIND(MemberPointer);
|
||||||
}
|
}
|
||||||
#undef TKIND
|
#undef TKIND
|
||||||
return cxstring::createRef(s);
|
return cxstring::createRef(s);
|
||||||
|
@ -707,6 +712,17 @@ long long clang_Type_getAlignOf(CXType T) {
|
||||||
return Ctx.getTypeAlignInChars(QT).getQuantity();
|
return Ctx.getTypeAlignInChars(QT).getQuantity();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CXType clang_Type_getClassType(CXType CT) {
|
||||||
|
QualType ET = QualType();
|
||||||
|
QualType T = GetQualType(CT);
|
||||||
|
const Type *TP = T.getTypePtrOrNull();
|
||||||
|
|
||||||
|
if (TP && TP->getTypeClass() == Type::MemberPointer) {
|
||||||
|
ET = QualType(cast<MemberPointerType> (TP)->getClass(), 0);
|
||||||
|
}
|
||||||
|
return MakeCXType(ET, GetTU(CT));
|
||||||
|
}
|
||||||
|
|
||||||
long long clang_Type_getSizeOf(CXType T) {
|
long long clang_Type_getSizeOf(CXType T) {
|
||||||
if (T.kind == CXType_Invalid)
|
if (T.kind == CXType_Invalid)
|
||||||
return CXTypeLayoutError_Invalid;
|
return CXTypeLayoutError_Invalid;
|
||||||
|
|
|
@ -61,6 +61,7 @@ clang_TParamCommandComment_isParamPositionValid
|
||||||
clang_TParamCommandComment_getDepth
|
clang_TParamCommandComment_getDepth
|
||||||
clang_TParamCommandComment_getIndex
|
clang_TParamCommandComment_getIndex
|
||||||
clang_Type_getAlignOf
|
clang_Type_getAlignOf
|
||||||
|
clang_Type_getClassType
|
||||||
clang_Type_getSizeOf
|
clang_Type_getSizeOf
|
||||||
clang_Type_getOffsetOf
|
clang_Type_getOffsetOf
|
||||||
clang_VerbatimBlockLineComment_getText
|
clang_VerbatimBlockLineComment_getText
|
||||||
|
|
Loading…
Reference in New Issue