Skip to content

Commit b0e8990

Browse files
committed
[ASTReader] Allow controlling separately whether validation should be disabled for a PCH vs a module file
This addresses an issue with how the PCH preable works, specifically: 1. When using a PCH/preamble the module hash changes and a different cache directory is used 2. When the preamble is used, PCH & PCM validation is disabled. Due to combination of #1 and #2, reparsing with preamble enabled can end up loading a stale module file before a header change and using it without updating it because validation is disabled and it doesn’t check that the header has changed and the module file is out-of-date. rdar://72611253 Differential Revision: https://reviews.llvm.org/D95159
1 parent c042aff commit b0e8990

File tree

17 files changed

+176
-41
lines changed

17 files changed

+176
-41
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5121,7 +5121,8 @@ def fhalf_no_semantic_interposition : Flag<["-"], "fhalf-no-semantic-interpositi
51215121
MarshallingInfoFlag<LangOpts<"HalfNoSemanticInterposition">>;
51225122
def fno_validate_pch : Flag<["-"], "fno-validate-pch">,
51235123
HelpText<"Disable validation of precompiled headers">,
5124-
MarshallingInfoFlag<PreprocessorOpts<"DisablePCHValidation">>;
5124+
MarshallingInfoFlag<PreprocessorOpts<"DisablePCHOrModuleValidation">, "DisableValidationForModuleKind::None">,
5125+
Normalizer<"makeFlagToValueNormalizer(DisableValidationForModuleKind::All)">;
51255126
def fallow_pcm_with_errors : Flag<["-"], "fallow-pcm-with-compiler-errors">,
51265127
HelpText<"Accept a PCM file that was created with compiler errors">,
51275128
MarshallingInfoFlag<FrontendOpts<"AllowPCMWithCompilerErrors">>;

clang/include/clang/Frontend/CompilerInstance.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class Preprocessor;
5050
class Sema;
5151
class SourceManager;
5252
class TargetInfo;
53+
enum class DisableValidationForModuleKind;
5354

5455
/// CompilerInstance - Helper class for managing a single instance of the Clang
5556
/// compiler.
@@ -659,16 +660,17 @@ class CompilerInstance : public ModuleLoader {
659660

660661
/// Create an external AST source to read a PCH file and attach it to the AST
661662
/// context.
662-
void createPCHExternalASTSource(StringRef Path, bool DisablePCHValidation,
663-
bool AllowPCHWithCompilerErrors,
664-
void *DeserializationListener,
665-
bool OwnDeserializationListener);
663+
void createPCHExternalASTSource(
664+
StringRef Path, DisableValidationForModuleKind DisableValidation,
665+
bool AllowPCHWithCompilerErrors, void *DeserializationListener,
666+
bool OwnDeserializationListener);
666667

667668
/// Create an external AST source to read a PCH file.
668669
///
669670
/// \return - The new object on success, or null on failure.
670671
static IntrusiveRefCntPtr<ASTReader> createPCHExternalASTSource(
671-
StringRef Path, StringRef Sysroot, bool DisablePCHValidation,
672+
StringRef Path, StringRef Sysroot,
673+
DisableValidationForModuleKind DisableValidation,
672674
bool AllowPCHWithCompilerErrors, Preprocessor &PP,
673675
InMemoryModuleCache &ModuleCache, ASTContext &Context,
674676
const PCHContainerReader &PCHContainerRdr,

clang/include/clang/Lex/PreprocessorOptions.h

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#ifndef LLVM_CLANG_LEX_PREPROCESSOROPTIONS_H_
1010
#define LLVM_CLANG_LEX_PREPROCESSOROPTIONS_H_
1111

12+
#include "clang/Basic/BitmaskEnum.h"
1213
#include "clang/Basic/LLVM.h"
1314
#include "clang/Lex/PreprocessorExcludedConditionalDirectiveSkipMapping.h"
1415
#include "llvm/ADT/StringRef.h"
@@ -40,6 +41,24 @@ enum ObjCXXARCStandardLibraryKind {
4041
ARCXX_libstdcxx
4142
};
4243

44+
/// Whether to disable the normal validation performed on precompiled
45+
/// headers and module files when they are loaded.
46+
enum class DisableValidationForModuleKind {
47+
/// Perform validation, don't disable it.
48+
None = 0,
49+
50+
/// Disable validation for a precompiled header and the modules it depends on.
51+
PCH = 0x1,
52+
53+
/// Disable validation for module files.
54+
Module = 0x2,
55+
56+
/// Disable validation for all kinds.
57+
All = PCH | Module,
58+
59+
LLVM_MARK_AS_BITMASK_ENUM(Module)
60+
};
61+
4362
/// PreprocessorOptions - This class is used for passing the various options
4463
/// used in preprocessor initialization to InitializePreprocessor().
4564
class PreprocessorOptions {
@@ -79,9 +98,10 @@ class PreprocessorOptions {
7998
/// Headers that will be converted to chained PCHs in memory.
8099
std::vector<std::string> ChainedIncludes;
81100

82-
/// When true, disables most of the normal validation performed on
83-
/// precompiled headers.
84-
bool DisablePCHValidation = false;
101+
/// Whether to disable most of the normal validation performed on
102+
/// precompiled headers and module files.
103+
DisableValidationForModuleKind DisablePCHOrModuleValidation =
104+
DisableValidationForModuleKind::None;
85105

86106
/// When true, a PCH with compiler errors will not be rejected.
87107
bool AllowPCHWithCompilerErrors = false;

clang/include/clang/Serialization/ASTReader.h

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include "clang/Lex/ExternalPreprocessorSource.h"
2424
#include "clang/Lex/HeaderSearch.h"
2525
#include "clang/Lex/PreprocessingRecord.h"
26+
#include "clang/Lex/PreprocessorOptions.h"
2627
#include "clang/Sema/ExternalSemaSource.h"
2728
#include "clang/Sema/IdentifierResolver.h"
2829
#include "clang/Sema/Sema.h"
@@ -441,6 +442,9 @@ class ASTReader
441442
/// imported from. For non-module AST types it should be invalid.
442443
SourceLocation CurrentImportLoc;
443444

445+
/// The module kind that is currently deserializing.
446+
Optional<ModuleKind> CurrentDeserializingModuleKind;
447+
444448
/// The global module index, if loaded.
445449
std::unique_ptr<GlobalModuleIndex> GlobalIndex;
446450

@@ -931,8 +935,8 @@ class ASTReader
931935
std::string isysroot;
932936

933937
/// Whether to disable the normal validation performed on precompiled
934-
/// headers when they are loaded.
935-
bool DisableValidation;
938+
/// headers and module files when they are loaded.
939+
DisableValidationForModuleKind DisableValidationKind;
936940

937941
/// Whether to accept an AST file with compiler errors.
938942
bool AllowASTWithCompilerErrors;
@@ -1215,6 +1219,8 @@ class ASTReader
12151219

12161220
llvm::DenseMap<const Decl *, bool> DefinitionSource;
12171221

1222+
bool shouldDisableValidationForFile(const serialization::ModuleFile &M) const;
1223+
12181224
/// Reads a statement from the specified cursor.
12191225
Stmt *ReadStmtFromStream(ModuleFile &F);
12201226

@@ -1473,9 +1479,9 @@ class ASTReader
14731479
/// user. This is only used with relocatable PCH files. If non-NULL,
14741480
/// a relocatable PCH file will use the default path "/".
14751481
///
1476-
/// \param DisableValidation If true, the AST reader will suppress most
1482+
/// \param DisableValidationKind If set, the AST reader will suppress most
14771483
/// of its regular consistency checking, allowing the use of precompiled
1478-
/// headers that cannot be determined to be compatible.
1484+
/// headers and module files that cannot be determined to be compatible.
14791485
///
14801486
/// \param AllowASTWithCompilerErrors If true, the AST reader will accept an
14811487
/// AST file the was created out of an AST with compiler errors,
@@ -1496,7 +1502,9 @@ class ASTReader
14961502
ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
14971503
ASTContext *Context, const PCHContainerReader &PCHContainerRdr,
14981504
ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
1499-
StringRef isysroot = "", bool DisableValidation = false,
1505+
StringRef isysroot = "",
1506+
DisableValidationForModuleKind DisableValidationKind =
1507+
DisableValidationForModuleKind::None,
15001508
bool AllowASTWithCompilerErrors = false,
15011509
bool AllowConfigurationMismatch = false,
15021510
bool ValidateSystemInputs = false,

clang/lib/Frontend/ASTUnit.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -809,9 +809,10 @@ std::unique_ptr<ASTUnit> ASTUnit::LoadFromASTFile(
809809
PP.getIdentifierTable(), PP.getSelectorTable(),
810810
PP.getBuiltinInfo());
811811

812-
bool disableValid = false;
812+
DisableValidationForModuleKind disableValid =
813+
DisableValidationForModuleKind::None;
813814
if (::getenv("LIBCLANG_DISABLE_PCH_VALIDATION"))
814-
disableValid = true;
815+
disableValid = DisableValidationForModuleKind::All;
815816
AST->Reader = new ASTReader(
816817
PP, *AST->ModuleCache, AST->Ctx.get(), PCHContainerRdr, {},
817818
/*isysroot=*/"",

clang/lib/Frontend/ChainedIncludesSource.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,10 @@ createASTReader(CompilerInstance &CI, StringRef pchFile,
8383
ASTDeserializationListener *deserialListener = nullptr) {
8484
Preprocessor &PP = CI.getPreprocessor();
8585
std::unique_ptr<ASTReader> Reader;
86-
Reader.reset(new ASTReader(PP, CI.getModuleCache(), &CI.getASTContext(),
87-
CI.getPCHContainerReader(),
88-
/*Extensions=*/{},
89-
/*isysroot=*/"", /*DisableValidation=*/true));
86+
Reader.reset(new ASTReader(
87+
PP, CI.getModuleCache(), &CI.getASTContext(), CI.getPCHContainerReader(),
88+
/*Extensions=*/{},
89+
/*isysroot=*/"", DisableValidationForModuleKind::PCH));
9090
for (unsigned ti = 0; ti < bufNames.size(); ++ti) {
9191
StringRef sr(bufNames[ti]);
9292
Reader->addInMemoryBuffer(sr, std::move(MemBufs[ti]));
@@ -129,7 +129,8 @@ IntrusiveRefCntPtr<ExternalSemaSource> clang::createChainedIncludesSource(
129129

130130
CInvok->getPreprocessorOpts().ChainedIncludes.clear();
131131
CInvok->getPreprocessorOpts().ImplicitPCHInclude.clear();
132-
CInvok->getPreprocessorOpts().DisablePCHValidation = true;
132+
CInvok->getPreprocessorOpts().DisablePCHOrModuleValidation =
133+
DisableValidationForModuleKind::PCH;
133134
CInvok->getPreprocessorOpts().Includes.clear();
134135
CInvok->getPreprocessorOpts().MacroIncludes.clear();
135136
CInvok->getPreprocessorOpts().Macros.clear();

clang/lib/Frontend/CompilerInstance.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -503,11 +503,12 @@ void CompilerInstance::createASTContext() {
503503
// ExternalASTSource
504504

505505
void CompilerInstance::createPCHExternalASTSource(
506-
StringRef Path, bool DisablePCHValidation, bool AllowPCHWithCompilerErrors,
507-
void *DeserializationListener, bool OwnDeserializationListener) {
506+
StringRef Path, DisableValidationForModuleKind DisableValidation,
507+
bool AllowPCHWithCompilerErrors, void *DeserializationListener,
508+
bool OwnDeserializationListener) {
508509
bool Preamble = getPreprocessorOpts().PrecompiledPreambleBytes.first != 0;
509510
TheASTReader = createPCHExternalASTSource(
510-
Path, getHeaderSearchOpts().Sysroot, DisablePCHValidation,
511+
Path, getHeaderSearchOpts().Sysroot, DisableValidation,
511512
AllowPCHWithCompilerErrors, getPreprocessor(), getModuleCache(),
512513
getASTContext(), getPCHContainerReader(),
513514
getFrontendOpts().ModuleFileExtensions, DependencyCollectors,
@@ -516,7 +517,8 @@ void CompilerInstance::createPCHExternalASTSource(
516517
}
517518

518519
IntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource(
519-
StringRef Path, StringRef Sysroot, bool DisablePCHValidation,
520+
StringRef Path, StringRef Sysroot,
521+
DisableValidationForModuleKind DisableValidation,
520522
bool AllowPCHWithCompilerErrors, Preprocessor &PP,
521523
InMemoryModuleCache &ModuleCache, ASTContext &Context,
522524
const PCHContainerReader &PCHContainerRdr,
@@ -528,7 +530,7 @@ IntrusiveRefCntPtr<ASTReader> CompilerInstance::createPCHExternalASTSource(
528530

529531
IntrusiveRefCntPtr<ASTReader> Reader(new ASTReader(
530532
PP, ModuleCache, &Context, PCHContainerRdr, Extensions,
531-
Sysroot.empty() ? "" : Sysroot.data(), DisablePCHValidation,
533+
Sysroot.empty() ? "" : Sysroot.data(), DisableValidation,
532534
AllowPCHWithCompilerErrors, /*AllowConfigurationMismatch*/ false,
533535
HSOpts.ModulesValidateSystemHeaders, HSOpts.ValidateASTInputFilesContent,
534536
UseGlobalModuleIndex));
@@ -1497,7 +1499,8 @@ void CompilerInstance::createASTReader() {
14971499
TheASTReader = new ASTReader(
14981500
getPreprocessor(), getModuleCache(), &getASTContext(),
14991501
getPCHContainerReader(), getFrontendOpts().ModuleFileExtensions,
1500-
Sysroot.empty() ? "" : Sysroot.c_str(), PPOpts.DisablePCHValidation,
1502+
Sysroot.empty() ? "" : Sysroot.c_str(),
1503+
PPOpts.DisablePCHOrModuleValidation,
15011504
/*AllowASTWithCompilerErrors=*/FEOpts.AllowPCMWithCompilerErrors,
15021505
/*AllowConfigurationMismatch=*/false, HSOpts.ModulesValidateSystemHeaders,
15031506
HSOpts.ValidateASTInputFilesContent,

clang/lib/Frontend/FrontendAction.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -873,9 +873,9 @@ bool FrontendAction::BeginSourceFile(CompilerInstance &CI,
873873
if (!CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) {
874874
CI.createPCHExternalASTSource(
875875
CI.getPreprocessorOpts().ImplicitPCHInclude,
876-
CI.getPreprocessorOpts().DisablePCHValidation,
877-
CI.getPreprocessorOpts().AllowPCHWithCompilerErrors, DeserialListener,
878-
DeleteDeserialListener);
876+
CI.getPreprocessorOpts().DisablePCHOrModuleValidation,
877+
CI.getPreprocessorOpts().AllowPCHWithCompilerErrors,
878+
DeserialListener, DeleteDeserialListener);
879879
if (!CI.getASTContext().getExternalSource())
880880
goto failure;
881881
}

clang/lib/Frontend/FrontendActions.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ void VerifyPCHAction::ExecuteAction() {
344344
CI.getPreprocessor(), CI.getModuleCache(), &CI.getASTContext(),
345345
CI.getPCHContainerReader(), CI.getFrontendOpts().ModuleFileExtensions,
346346
Sysroot.empty() ? "" : Sysroot.c_str(),
347-
/*DisableValidation*/ false,
347+
DisableValidationForModuleKind::None,
348348
/*AllowASTWithCompilerErrors*/ false,
349349
/*AllowConfigurationMismatch*/ true,
350350
/*ValidateSystemInputs*/ true));

clang/lib/Frontend/PrecompiledPreamble.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -812,7 +812,8 @@ void PrecompiledPreamble::configurePreamble(
812812
PreprocessorOpts.PrecompiledPreambleBytes.first = Bounds.Size;
813813
PreprocessorOpts.PrecompiledPreambleBytes.second =
814814
Bounds.PreambleEndsAtStartOfLine;
815-
PreprocessorOpts.DisablePCHValidation = true;
815+
PreprocessorOpts.DisablePCHOrModuleValidation =
816+
DisableValidationForModuleKind::PCH;
816817

817818
setupPreambleStorage(Storage, PreprocessorOpts, VFS);
818819
}

clang/lib/Serialization/ASTReader.cpp

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2211,6 +2211,29 @@ void ASTReader::resolvePendingMacro(IdentifierInfo *II,
22112211
PP.setLoadedMacroDirective(II, Earliest, Latest);
22122212
}
22132213

2214+
bool ASTReader::shouldDisableValidationForFile(
2215+
const serialization::ModuleFile &M) const {
2216+
if (DisableValidationKind == DisableValidationForModuleKind::None)
2217+
return false;
2218+
2219+
// If a PCH is loaded and validation is disabled for PCH then disable
2220+
// validation for the PCH and the modules it loads.
2221+
ModuleKind K = CurrentDeserializingModuleKind.getValueOr(M.Kind);
2222+
2223+
switch (K) {
2224+
case MK_MainFile:
2225+
case MK_Preamble:
2226+
case MK_PCH:
2227+
return bool(DisableValidationKind & DisableValidationForModuleKind::PCH);
2228+
case MK_ImplicitModule:
2229+
case MK_ExplicitModule:
2230+
case MK_PrebuiltModule:
2231+
return bool(DisableValidationKind & DisableValidationForModuleKind::Module);
2232+
}
2233+
2234+
return false;
2235+
}
2236+
22142237
ASTReader::InputFileInfo
22152238
ASTReader::readInputFileInfo(ModuleFile &F, unsigned ID) {
22162239
// Go find this input file.
@@ -2357,7 +2380,7 @@ InputFile ASTReader::getInputFile(ModuleFile &F, unsigned ID, bool Complain) {
23572380
auto HasInputFileChanged = [&]() {
23582381
if (StoredSize != File->getSize())
23592382
return ModificationType::Size;
2360-
if (!DisableValidation && StoredTime &&
2383+
if (!shouldDisableValidationForFile(F) && StoredTime &&
23612384
StoredTime != File->getModificationTime()) {
23622385
// In case the modification time changes but not the content,
23632386
// accept the cached file as legit.
@@ -2573,6 +2596,8 @@ ASTReader::ReadControlBlock(ModuleFile &F,
25732596
return Success;
25742597
};
25752598

2599+
bool DisableValidation = shouldDisableValidationForFile(F);
2600+
25762601
// Read all of the records and blocks in the control block.
25772602
RecordData Record;
25782603
unsigned NumInputs = 0;
@@ -2871,7 +2896,8 @@ ASTReader::ReadControlBlock(ModuleFile &F,
28712896
// If we're implicitly loading a module, the base directory can't
28722897
// change between the build and use.
28732898
// Don't emit module relocation error if we have -fno-validate-pch
2874-
if (!PP.getPreprocessorOpts().DisablePCHValidation &&
2899+
if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
2900+
DisableValidationForModuleKind::Module) &&
28752901
F.Kind != MK_ExplicitModule && F.Kind != MK_PrebuiltModule) {
28762902
auto BuildDir = PP.getFileManager().getDirectory(Blob);
28772903
if (!BuildDir || *BuildDir != M->Directory) {
@@ -3903,7 +3929,9 @@ ASTReader::ReadModuleMapFileBlock(RecordData &Record, ModuleFile &F,
39033929
auto &Map = PP.getHeaderSearchInfo().getModuleMap();
39043930
const FileEntry *ModMap = M ? Map.getModuleMapFileForUniquing(M) : nullptr;
39053931
// Don't emit module relocation error if we have -fno-validate-pch
3906-
if (!PP.getPreprocessorOpts().DisablePCHValidation && !ModMap) {
3932+
if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
3933+
DisableValidationForModuleKind::Module) &&
3934+
!ModMap) {
39073935
if ((ClientLoadCapabilities & ARR_OutOfDate) == 0) {
39083936
if (auto ASTFE = M ? M->getASTFile() : None) {
39093937
// This module was defined by an imported (explicit) module.
@@ -4189,6 +4217,8 @@ ASTReader::ASTReadResult ASTReader::ReadAST(StringRef FileName,
41894217
SmallVectorImpl<ImportedSubmodule> *Imported) {
41904218
llvm::SaveAndRestore<SourceLocation>
41914219
SetCurImportLocRAII(CurrentImportLoc, ImportLoc);
4220+
llvm::SaveAndRestore<Optional<ModuleKind>> SetCurModuleKindRAII(
4221+
CurrentDeserializingModuleKind, Type);
41924222

41934223
// Defer any pending actions until we get to the end of reading the AST file.
41944224
Deserializing AnASTFile(this);
@@ -4623,6 +4653,7 @@ ASTReader::readUnhashedControlBlock(ModuleFile &F, bool WasImportedBy,
46234653
PP.getHeaderSearchInfo().getHeaderSearchOpts();
46244654
bool AllowCompatibleConfigurationMismatch =
46254655
F.Kind == MK_ExplicitModule || F.Kind == MK_PrebuiltModule;
4656+
bool DisableValidation = shouldDisableValidationForFile(F);
46264657

46274658
ASTReadResult Result = readUnhashedControlBlockImpl(
46284659
&F, F.Data, ClientLoadCapabilities, AllowCompatibleConfigurationMismatch,
@@ -5514,7 +5545,8 @@ ASTReader::ReadSubmoduleBlock(ModuleFile &F, unsigned ClientLoadCapabilities) {
55145545
if (!ParentModule) {
55155546
if (const FileEntry *CurFile = CurrentModule->getASTFile()) {
55165547
// Don't emit module relocation error if we have -fno-validate-pch
5517-
if (!PP.getPreprocessorOpts().DisablePCHValidation &&
5548+
if (!bool(PP.getPreprocessorOpts().DisablePCHOrModuleValidation &
5549+
DisableValidationForModuleKind::Module) &&
55185550
CurFile != F.File) {
55195551
Error(diag::err_module_file_conflict,
55205552
CurrentModule->getTopLevelModuleName(), CurFile->getName(),
@@ -11601,20 +11633,21 @@ ASTReader::ASTReader(Preprocessor &PP, InMemoryModuleCache &ModuleCache,
1160111633
ASTContext *Context,
1160211634
const PCHContainerReader &PCHContainerRdr,
1160311635
ArrayRef<std::shared_ptr<ModuleFileExtension>> Extensions,
11604-
StringRef isysroot, bool DisableValidation,
11636+
StringRef isysroot,
11637+
DisableValidationForModuleKind DisableValidationKind,
1160511638
bool AllowASTWithCompilerErrors,
1160611639
bool AllowConfigurationMismatch, bool ValidateSystemInputs,
1160711640
bool ValidateASTInputFilesContent, bool UseGlobalIndex,
1160811641
std::unique_ptr<llvm::Timer> ReadTimer)
11609-
: Listener(DisableValidation
11642+
: Listener(bool(DisableValidationKind &DisableValidationForModuleKind::PCH)
1161011643
? cast<ASTReaderListener>(new SimpleASTReaderListener(PP))
1161111644
: cast<ASTReaderListener>(new PCHValidator(PP, *this))),
1161211645
SourceMgr(PP.getSourceManager()), FileMgr(PP.getFileManager()),
1161311646
PCHContainerRdr(PCHContainerRdr), Diags(PP.getDiagnostics()), PP(PP),
1161411647
ContextObj(Context), ModuleMgr(PP.getFileManager(), ModuleCache,
1161511648
PCHContainerRdr, PP.getHeaderSearchInfo()),
1161611649
DummyIdResolver(PP), ReadTimer(std::move(ReadTimer)), isysroot(isysroot),
11617-
DisableValidation(DisableValidation),
11650+
DisableValidationKind(DisableValidationKind),
1161811651
AllowASTWithCompilerErrors(AllowASTWithCompilerErrors),
1161911652
AllowConfigurationMismatch(AllowConfigurationMismatch),
1162011653
ValidateSystemInputs(ValidateSystemInputs),
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@interface I
2+
- (void)call_me;
3+
@end
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module mod {
2+
header "head.h"
3+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@interface I
2+
- (void)call_me_new;
3+
@end

0 commit comments

Comments
 (0)