@@ -279,7 +279,9 @@ ASTReaderListener::~ASTReaderListener() = default;
279279// / \param Diags If non-NULL, diagnostics will be emitted via this engine.
280280// / \param AllowCompatibleDifferences If true, differences between compatible
281281// / language options will be permitted.
282- static void checkLanguageOptions (const LangOptions &LangOpts,
282+ // /
283+ // / \returns true if the languagae options mis-match, false otherwise.
284+ static bool checkLanguageOptions (const LangOptions &LangOpts,
283285 const LangOptions &ExistingLangOpts,
284286 StringRef ModuleFilename,
285287 DiagnosticsEngine *Diags,
@@ -288,27 +290,30 @@ static void checkLanguageOptions(const LangOptions &LangOpts,
288290 if (ExistingLangOpts.Name != LangOpts.Name ) { \
289291 if (Diags) { \
290292 if (Bits == 1 ) \
291- Diags->Report (diag::warn_ast_file_langopt_mismatch) \
293+ Diags->Report (diag::err_ast_file_langopt_mismatch) \
292294 << Description << LangOpts.Name << ExistingLangOpts.Name \
293295 << ModuleFilename; \
294296 else \
295- Diags->Report (diag::warn_ast_file_langopt_value_mismatch) \
297+ Diags->Report (diag::err_ast_file_langopt_value_mismatch) \
296298 << Description << ModuleFilename; \
297299 } \
300+ return true ; \
298301 }
299302
300303#define VALUE_LANGOPT (Name, Bits, Default, Description ) \
301304 if (ExistingLangOpts.Name != LangOpts.Name ) { \
302305 if (Diags) \
303- Diags->Report (diag::warn_ast_file_langopt_value_mismatch) \
306+ Diags->Report (diag::err_ast_file_langopt_value_mismatch) \
304307 << Description << ModuleFilename; \
308+ return true ; \
305309 }
306310
307311#define ENUM_LANGOPT (Name, Type, Bits, Default, Description ) \
308312 if (ExistingLangOpts.get ##Name () != LangOpts.get ##Name ()) { \
309313 if (Diags) \
310- Diags->Report (diag::warn_ast_file_langopt_value_mismatch) \
314+ Diags->Report (diag::err_ast_file_langopt_value_mismatch) \
311315 << Description << ModuleFilename; \
316+ return true ; \
312317 }
313318
314319#define COMPATIBLE_LANGOPT (Name, Bits, Default, Description ) \
@@ -330,21 +335,24 @@ static void checkLanguageOptions(const LangOptions &LangOpts,
330335
331336 if (ExistingLangOpts.ModuleFeatures != LangOpts.ModuleFeatures ) {
332337 if (Diags)
333- Diags->Report (diag::warn_ast_file_langopt_value_mismatch )
338+ Diags->Report (diag::err_ast_file_langopt_value_mismatch )
334339 << " module features" << ModuleFilename;
340+ return true ;
335341 }
336342
337343 if (ExistingLangOpts.ObjCRuntime != LangOpts.ObjCRuntime ) {
338344 if (Diags)
339- Diags->Report (diag::warn_ast_file_langopt_value_mismatch )
345+ Diags->Report (diag::err_ast_file_langopt_value_mismatch )
340346 << " target Objective-C runtime" << ModuleFilename;
347+ return true ;
341348 }
342349
343350 if (ExistingLangOpts.CommentOpts .BlockCommandNames !=
344351 LangOpts.CommentOpts .BlockCommandNames ) {
345352 if (Diags)
346- Diags->Report (diag::warn_ast_file_langopt_value_mismatch )
353+ Diags->Report (diag::err_ast_file_langopt_value_mismatch )
347354 << " block command names" << ModuleFilename;
355+ return true ;
348356 }
349357
350358 // Sanitizer feature mismatches are treated as compatible differences. If
@@ -370,8 +378,11 @@ static void checkLanguageOptions(const LangOptions &LangOpts,
370378 }
371379#include " clang/Basic/Sanitizers.def"
372380 }
381+ return true ;
373382 }
374383 }
384+
385+ return false ;
375386}
376387
377388// / Compare the given set of target options against an existing set of
@@ -448,10 +459,9 @@ bool PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts,
448459 StringRef ModuleFilename, bool Complain,
449460 bool AllowCompatibleDifferences) {
450461 const LangOptions &ExistingLangOpts = PP.getLangOpts ();
451- checkLanguageOptions (LangOpts, ExistingLangOpts, ModuleFilename,
452- Complain ? &Reader.Diags : nullptr ,
453- AllowCompatibleDifferences);
454- return false ;
462+ return checkLanguageOptions (LangOpts, ExistingLangOpts, ModuleFilename,
463+ Complain ? &Reader.Diags : nullptr ,
464+ AllowCompatibleDifferences);
455465}
456466
457467bool PCHValidator::ReadTargetOptions (const TargetOptions &TargetOpts,
@@ -5388,9 +5398,8 @@ namespace {
53885398 bool ReadLanguageOptions (const LangOptions &LangOpts,
53895399 StringRef ModuleFilename, bool Complain,
53905400 bool AllowCompatibleDifferences) override {
5391- checkLanguageOptions (ExistingLangOpts, LangOpts, ModuleFilename, nullptr ,
5392- AllowCompatibleDifferences);
5393- return false ;
5401+ return checkLanguageOptions (ExistingLangOpts, LangOpts, ModuleFilename,
5402+ nullptr , AllowCompatibleDifferences);
53945403 }
53955404
53965405 bool ReadTargetOptions (const TargetOptions &TargetOpts,
0 commit comments