diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -1099,6 +1099,8 @@ // \brief WebAssembly reference types with auto numeration #define WASM_TYPE(Name, Id, SingletonId) PREDEF_TYPE_##Id##_ID, #include "clang/Basic/WebAssemblyReferenceTypes.def" + // Sentinel value. Considered a predefined type but not useable as one. + PREDEF_TYPE_LAST_ID }; /// The number of predefined type IDs that are reserved for @@ -1106,7 +1108,13 @@ /// /// Type IDs for non-predefined types will start at /// NUM_PREDEF_TYPE_IDs. -const unsigned NUM_PREDEF_TYPE_IDS = 300; +const unsigned NUM_PREDEF_TYPE_IDS = 500; + +// Ensure we do not overrun the predefined types we reserved +// in the enum PredefinedTypeIDs above. +static_assert(PREDEF_TYPE_LAST_ID < NUM_PREDEF_TYPE_IDS, + "Too many enumerators in PredefinedTypeIDs. Review the value of " + "NUM_PREDEF_TYPE_IDS"); /// Record codes for each kind of type. /// diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -6983,6 +6983,10 @@ if (Index < NUM_PREDEF_TYPE_IDS) { QualType T; switch ((PredefinedTypeIDs)Index) { + case PREDEF_TYPE_LAST_ID: + // We should never use this one. + llvm_unreachable("Invalid predefined type"); + break; case PREDEF_TYPE_NULL_ID: return QualType(); case PREDEF_TYPE_VOID_ID: diff --git a/clang/test/Modules/embed-files-compressed.cpp b/clang/test/Modules/embed-files-compressed.cpp --- a/clang/test/Modules/embed-files-compressed.cpp +++ b/clang/test/Modules/embed-files-compressed.cpp @@ -17,7 +17,7 @@ // RUN: %clang_cc1 -fmodules -I%t -fmodules-cache-path=%t -fmodule-name=a -emit-module %t/modulemap -fmodules-embed-all-files -o %t/a.pcm // // The above embeds ~4.5MB of highly-predictable /s and \ns into the pcm file. -// Check that the resulting file is under 40KB: +// Check that the resulting file is under 60KB: // // RUN: wc -c %t/a.pcm | FileCheck --check-prefix=CHECK-SIZE %s -// CHECK-SIZE: {{(^|[^0-9])[123][0-9][0-9][0-9][0-9]($|[^0-9])}} +// CHECK-SIZE: {{(^|[^0-9])[1-5][0-9][0-9][0-9][0-9]($|[^0-9])}} diff --git a/clang/test/Modules/empty.modulemap b/clang/test/Modules/empty.modulemap --- a/clang/test/Modules/empty.modulemap +++ b/clang/test/Modules/empty.modulemap @@ -13,8 +13,8 @@ // The module file should be identical each time we produce it. // RUN: diff %t/base.pcm %t/check.pcm // -// We expect an empty module to be less than 40KB (and at least 10K, for now). +// We expect an empty module to be less than 60KB (and at least 10K, for now). // RUN: wc -c %t/base.pcm | FileCheck --check-prefix=CHECK-SIZE %s -// CHECK-SIZE: {{(^|[^0-9])[123][0-9][0-9][0-9][0-9]($|[^0-9])}} +// CHECK-SIZE: {{(^|[^0-9])[1-5][0-9][0-9][0-9][0-9]($|[^0-9])}} module empty { header "Inputs/empty.h" export * }