diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -374,6 +374,12 @@ DiagnosticMapping Mapping = makeUserMapping(Map, L); Mapping.setUpgradedFromWarning(WasUpgradedFromWarning); + // Make sure we propagate the NoWarningAsError flag from an existing + // mapping (which may be the default mapping). + DiagnosticMapping &Info = GetCurDiagState()->getOrAddMapping(Diag); + Mapping.setNoWarningAsError(Info.hasNoWarningAsError() || + Mapping.hasNoWarningAsError()); + // Common case; setting all the diagnostics of a group in one place. if ((L.isInvalid() || L == DiagStatesByLoc.getCurDiagStateLoc()) && DiagStatesByLoc.getCurDiagState()) { diff --git a/clang/test/Lexer/pragma-message.c b/clang/test/Lexer/pragma-message.c --- a/clang/test/Lexer/pragma-message.c +++ b/clang/test/Lexer/pragma-message.c @@ -1,6 +1,5 @@ /* Test pragma message directive from http://msdn.microsoft.com/en-us/library/x7dkzch2.aspx */ - // message: Sends a string literal to the standard output without terminating // the compilation. // #pragma message(messagestring) @@ -8,6 +7,7 @@ // #pragma message messagestring // // RUN: %clang_cc1 -fsyntax-only -verify -Werror %s +// RUN: %clang_cc1 -fsyntax-only -verify -Werror -W#pragma-messages %s #define STRING2(x) #x #define STRING(x) STRING2(x) #pragma message(":O I'm a message! " STRING(__LINE__)) // expected-warning {{:O I'm a message! 13}}