// Test that pragma diagnostic mappings from an explicit module are not // corrupted by the presence of non-affecting module map files. // // When non-affecting module map files are pruned, NonAffectingRanges becomes // non-empty. Ensure that getAdjustedOffset is not incorrectly applied to // file-internal byte offsets in WritePragmaDiagnosticMappings, corrupting the // serialized diagnostic state transition offsets. // RUN: rm -rf %t // RUN: split-file %s %t // Build the module with a non-affecting module map present. // RUN: %clang_cc1 -std=c++20 -fmodules \ // RUN: -fmodule-map-file=%t/nonaffecting/module.modulemap \ // RUN: -emit-module -fmodule-name=diag_pragma \ // RUN: -x c++ %t/module.modulemap -o %t/diag_pragma.pcm // Use the module and verify the warning is suppressed. // RUN: %clang_cc1 -std=c++20 -fmodules \ // RUN: -fmodule-file=%t/diag_pragma.pcm \ // RUN: -I %t -verify %t/main.cpp //--- module.modulemap module diag_pragma { header "header.h" } //--- header.h #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wstring-plus-int" template const char *suppressed(T t) { return "foo" + t; } #pragma clang diagnostic pop template const char *unsuppressed(T t) { return "bar" + t; } //--- nonaffecting/module.modulemap module nonaffecting {} //--- main.cpp #include "header.h" void test() { suppressed(0); // no warning expected - suppressed by pragma in module // expected-warning@header.h:9 {{adding 'int' to a string}} // expected-note@header.h:9 {{use array indexing}} unsuppressed(0); // expected-note {{in instantiation of}} }