
clang-cl maps /wdNNNN to -Wno-flags for a few warnings that map cleanly from cl.exe concepts to clang concepts. This patch adds support for the same numbers to `#pragma warning(disable : NNNN)`. It also lets `#pragma warning(push)` and `#pragma warning(pop)` have an effect, since these are used together with `warning(disable)`. The optional numeric argument to `warning(push)` is ignored, as are the other non-`disable` `pragma warning()` arguments. (Supporting `error` would be easy, but we also don't support `/we`, and those should probably be added together.) The motivating example is that a bunch of code (including in LLVM) uses this idiom to locally disable warnings about calls to deprecated functions in Windows-only code, and 4996 maps nicely to -Wno-deprecated-declarations: #pragma warning(push) #pragma warning(disable: 4996) f(); #pragma warning(pop) Implementation-wise: - Move `/wd` flag handling from Options.td to actual Driver-level code - Extract the function mapping cl.exe IDs to warning groups to the new file clang/lib/Basic/CLWarnings.cpp - Create a diag::Group enum so that CLWarnings.cpp can refer to existing groups by ID (and give DllexportExplicitInstantiationDecl a named group), and add a function to map a diag::Group to the spelling of it's associated commandline flag - Call that new function from PragmaWarningHandler Differential Revision: https://reviews.llvm.org/D110668
29 lines
1023 B
C++
29 lines
1023 B
C++
//===--- CLWarnings.h - Maps some cl.exe warning ids -----------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the Diagnostic-related interfaces.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "clang/Basic/CLWarnings.h"
|
|
#include "clang/Basic/DiagnosticCategories.h"
|
|
|
|
using namespace clang;
|
|
|
|
llvm::Optional<diag::Group>
|
|
clang::diagGroupFromCLWarningID(unsigned CLWarningID) {
|
|
switch (CLWarningID) {
|
|
case 4005: return diag::Group::MacroRedefined;
|
|
case 4018: return diag::Group::SignCompare;
|
|
case 4100: return diag::Group::UnusedParameter;
|
|
case 4910: return diag::Group::DllexportExplicitInstantiationDecl;
|
|
case 4996: return diag::Group::DeprecatedDeclarations;
|
|
}
|
|
return {};
|
|
}
|