diff options
author | Emilio Cobos Alvarez <emilio@crisal.io> | 2019-02-26 15:04:18 +0000 |
---|---|---|
committer | Emilio Cobos Alvarez <emilio@crisal.io> | 2019-02-26 15:04:18 +0000 |
commit | 0d76dc285c17c3e87994e46e4e0dc8383c755e4b (patch) | |
tree | 6df0b7408f9c6ba05a6594c1fd3c76994539fb04 /clang | |
parent | 582d46328ce644d791f4dce31b005fc260d33611 (diff) | |
download | bcm5719-llvm-0d76dc285c17c3e87994e46e4e0dc8383c755e4b.tar.gz bcm5719-llvm-0d76dc285c17c3e87994e46e4e0dc8383c755e4b.zip |
[libclang] Avoid crashing when getting layout info of an undeduced type.
When the type is not deducible, return an error instead of crashing.
This fixes https://bugs.llvm.org/show_bug.cgi?id=40813.
Differential Revision: https://reviews.llvm.org/D58569
llvm-svn: 354885
Diffstat (limited to 'clang')
-rw-r--r-- | clang/include/clang-c/Index.h | 8 | ||||
-rw-r--r-- | clang/test/Index/print-type-size.cpp | 6 | ||||
-rw-r--r-- | clang/tools/c-index-test/c-index-test.c | 39 | ||||
-rw-r--r-- | clang/tools/libclang/CXType.cpp | 6 |
4 files changed, 46 insertions, 13 deletions
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index e6555fae78a..a5ef2d20587 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -32,7 +32,7 @@ * compatible, thus CINDEX_VERSION_MAJOR is expected to remain stable. */ #define CINDEX_VERSION_MAJOR 0 -#define CINDEX_VERSION_MINOR 52 +#define CINDEX_VERSION_MINOR 53 #define CINDEX_VERSION_ENCODE(major, minor) ( \ ((major) * 10000) \ @@ -3841,7 +3841,11 @@ enum CXTypeLayoutError { /** * The Field name is not valid for this record. */ - CXTypeLayoutError_InvalidFieldName = -5 + CXTypeLayoutError_InvalidFieldName = -5, + /** + * The type is undeduced. + */ + CXTypeLayoutError_Undeduced = -6 }; /** diff --git a/clang/test/Index/print-type-size.cpp b/clang/test/Index/print-type-size.cpp index 1ea53462733..b4098d97726 100644 --- a/clang/test/Index/print-type-size.cpp +++ b/clang/test/Index/print-type-size.cpp @@ -400,4 +400,10 @@ plopplop; struct lastValid { }; +// CHECK64: CXXMethod=Tie:[[@LINE+3]]:8 (const) [type=auto (void *) const] [typekind=FunctionProto] [sizeof=1] [alignof=4] [resulttype=auto] [resulttypekind=Auto] [resultsizeof=-6] [resultalignof=-6] +// CHECK32: CXXMethod=Tie:[[@LINE+2]]:8 (const) [type=auto (void *) const] [typekind=FunctionProto] [sizeof=1] [alignof=4] [resulttype=auto] [resulttypekind=Auto] [resultsizeof=-6] [resultalignof=-6] +class BrowsingContext { + auto Tie(void*) const; +}; + } diff --git a/clang/tools/c-index-test/c-index-test.c b/clang/tools/c-index-test/c-index-test.c index fc6ba46fd6f..2cf442ef0dc 100644 --- a/clang/tools/c-index-test/c-index-test.c +++ b/clang/tools/c-index-test/c-index-test.c @@ -1670,29 +1670,44 @@ static enum CXChildVisitResult PrintType(CXCursor cursor, CXCursor p, return CXChildVisit_Recurse; } -static enum CXChildVisitResult PrintTypeSize(CXCursor cursor, CXCursor p, - CXClientData d) { - CXType T; - enum CXCursorKind K = clang_getCursorKind(cursor); - if (clang_isInvalid(K)) - return CXChildVisit_Recurse; - T = clang_getCursorType(cursor); - PrintCursor(cursor, NULL); - PrintTypeAndTypeKind(T, " [type=%s] [typekind=%s]"); +static void PrintSingleTypeSize(CXType T, const char *TypeKindFormat, + const char *SizeFormat, + const char *AlignFormat) { + PrintTypeAndTypeKind(T, TypeKindFormat); /* Print the type sizeof if applicable. */ { long long Size = clang_Type_getSizeOf(T); if (Size >= 0 || Size < -1 ) { - printf(" [sizeof=%lld]", Size); + printf(SizeFormat, Size); } } /* Print the type alignof if applicable. */ { long long Align = clang_Type_getAlignOf(T); if (Align >= 0 || Align < -1) { - printf(" [alignof=%lld]", Align); + printf(AlignFormat, Align); } } + + /* Print the return type if it exists. */ + { + CXType RT = clang_getResultType(T); + if (RT.kind != CXType_Invalid) + PrintSingleTypeSize(RT, " [resulttype=%s] [resulttypekind=%s]", + " [resultsizeof=%lld]", " [resultalignof=%lld]"); + } +} + +static enum CXChildVisitResult PrintTypeSize(CXCursor cursor, CXCursor p, + CXClientData d) { + CXType T; + enum CXCursorKind K = clang_getCursorKind(cursor); + if (clang_isInvalid(K)) + return CXChildVisit_Recurse; + T = clang_getCursorType(cursor); + PrintCursor(cursor, NULL); + PrintSingleTypeSize(T, " [type=%s] [typekind=%s]", " [sizeof=%lld]", + " [alignof=%lld]"); /* Print the record field offset if applicable. */ { CXString FieldSpelling = clang_getCursorSpelling(cursor); @@ -1730,7 +1745,9 @@ static enum CXChildVisitResult PrintTypeSize(CXCursor cursor, CXCursor p, if (IsBitfield) printf(" [BitFieldSize=%d]", clang_getFieldDeclBitWidth(cursor)); } + printf("\n"); + return CXChildVisit_Recurse; } diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp index 55397d6fa7f..0d1bfec92fb 100644 --- a/clang/tools/libclang/CXType.cpp +++ b/clang/tools/libclang/CXType.cpp @@ -891,6 +891,9 @@ long long clang_Type_getAlignOf(CXType T) { return CXTypeLayoutError_Incomplete; if (QT->isDependentType()) return CXTypeLayoutError_Dependent; + if (const auto *Deduced = dyn_cast<DeducedType>(QT)) + if (Deduced->getDeducedType().isNull()) + return CXTypeLayoutError_Undeduced; // Exceptions by GCC extension - see ASTContext.cpp:1313 getTypeInfoImpl // if (QT->isFunctionType()) return 4; // Bug #15511 - should be 1 // if (QT->isVoidType()) return 1; @@ -928,6 +931,9 @@ long long clang_Type_getSizeOf(CXType T) { return CXTypeLayoutError_Dependent; if (!QT->isConstantSizeType()) return CXTypeLayoutError_NotConstantSize; + if (const auto *Deduced = dyn_cast<DeducedType>(QT)) + if (Deduced->getDeducedType().isNull()) + return CXTypeLayoutError_Undeduced; // [gcc extension] lib/AST/ExprConstant.cpp:1372 // HandleSizeof : {voidtype,functype} == 1 // not handled by ASTContext.cpp:1313 getTypeInfoImpl |