From 0cd9d8a48bdddb17de2c6388f9d775353f9acab9 Mon Sep 17 00:00:00 2001 From: Amy Huang Date: Wed, 29 Sep 2021 18:45:08 -0700 Subject: [PATCH] Revert "[clang-cl] Accept `#pragma warning(disable : N)` for some N" because it causes `error: error reading '/wd4091'` errors in compiler-rt builds. --- clang/include/clang/Basic/CLWarnings.h | 26 ---------------------- clang/include/clang/Basic/Diagnostic.h | 3 --- clang/include/clang/Basic/DiagnosticCategories.h | 7 ------ clang/include/clang/Basic/DiagnosticGroups.td | 1 - clang/include/clang/Basic/DiagnosticIDs.h | 6 ----- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/include/clang/Driver/Options.td | 11 +++++++++- clang/lib/Basic/CLWarnings.cpp | 28 ------------------------ clang/lib/Basic/CMakeLists.txt | 1 - clang/lib/Basic/Diagnostic.cpp | 8 ------- clang/lib/Basic/DiagnosticIDs.cpp | 12 +++------- clang/lib/Driver/ToolChains/Clang.cpp | 22 +------------------ clang/lib/Lex/Pragma.cpp | 22 +------------------ clang/test/Driver/cl-options.c | 2 +- clang/test/Sema/pragma-warning.cpp | 24 -------------------- clang/tools/diagtool/DiagnosticNames.cpp | 5 ++--- clang/utils/TableGen/ClangDiagnosticsEmitter.cpp | 22 ++++++++----------- llvm/utils/gn/secondary/clang/lib/Basic/BUILD.gn | 1 - 18 files changed, 28 insertions(+), 175 deletions(-) delete mode 100644 clang/include/clang/Basic/CLWarnings.h delete mode 100644 clang/lib/Basic/CLWarnings.cpp delete mode 100644 clang/test/Sema/pragma-warning.cpp diff --git a/clang/include/clang/Basic/CLWarnings.h b/clang/include/clang/Basic/CLWarnings.h deleted file mode 100644 index e3351f4..0000000 --- a/clang/include/clang/Basic/CLWarnings.h +++ /dev/null @@ -1,26 +0,0 @@ -//===--- 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 -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_CLANG_BASIC_CLWARNINGS_H -#define LLVM_CLANG_BASIC_CLWARNINGS_H - -#include "llvm/ADT/Optional.h" - -namespace clang { - -namespace diag { -enum class Group; -} - -/// For cl.exe warning IDs that cleany map to clang diagnostic groups, -/// returns the corresponding group. Else, returns an empty Optional. -llvm::Optional diagGroupFromCLWarningID(unsigned); - -} // end namespace clang - -#endif // LLVM_CLANG_BASIC_CLWARNINGS_H diff --git a/clang/include/clang/Basic/Diagnostic.h b/clang/include/clang/Basic/Diagnostic.h index efb7258..3b915fb 100644 --- a/clang/include/clang/Basic/Diagnostic.h +++ b/clang/include/clang/Basic/Diagnostic.h @@ -807,9 +807,6 @@ public: bool setSeverityForGroup(diag::Flavor Flavor, StringRef Group, diag::Severity Map, SourceLocation Loc = SourceLocation()); - bool setSeverityForGroup(diag::Flavor Flavor, diag::Group Group, - diag::Severity Map, - SourceLocation Loc = SourceLocation()); /// Set the warning-as-error flag for the given diagnostic group. /// diff --git a/clang/include/clang/Basic/DiagnosticCategories.h b/clang/include/clang/Basic/DiagnosticCategories.h index 2bbdeb3..0decf15 100644 --- a/clang/include/clang/Basic/DiagnosticCategories.h +++ b/clang/include/clang/Basic/DiagnosticCategories.h @@ -19,13 +19,6 @@ namespace clang { #undef GET_CATEGORY_TABLE DiagCat_NUM_CATEGORIES }; - - enum class Group { -#define DIAG_ENTRY(GroupName, FlagNameOffset, Members, SubGroups) GroupName, -#include "clang/Basic/DiagnosticGroups.inc" -#undef CATEGORY -#undef DIAG_ENTRY - }; } // end namespace diag } // end namespace clang diff --git a/clang/include/clang/Basic/DiagnosticGroups.td b/clang/include/clang/Basic/DiagnosticGroups.td index 761b323..23e9144 100644 --- a/clang/include/clang/Basic/DiagnosticGroups.td +++ b/clang/include/clang/Basic/DiagnosticGroups.td @@ -396,7 +396,6 @@ def Dangling : DiagGroup<"dangling", [DanglingField, DanglingGsl, ReturnStackAddress]>; def DistributedObjectModifiers : DiagGroup<"distributed-object-modifiers">; -def DllexportExplicitInstantiationDecl : DiagGroup<"dllexport-explicit-instantiation-decl">; def ExcessInitializers : DiagGroup<"excess-initializers">; def ExpansionToDefined : DiagGroup<"expansion-to-defined">; def FlagEnum : DiagGroup<"flag-enum">; diff --git a/clang/include/clang/Basic/DiagnosticIDs.h b/clang/include/clang/Basic/DiagnosticIDs.h index aef8651..288504d 100644 --- a/clang/include/clang/Basic/DiagnosticIDs.h +++ b/clang/include/clang/Basic/DiagnosticIDs.h @@ -25,8 +25,6 @@ namespace clang { // Import the diagnostic enums themselves. namespace diag { - enum class Group; - // Size of each of the diagnostic categories. enum { DIAG_SIZE_COMMON = 300, @@ -226,10 +224,6 @@ public: /// static bool isBuiltinExtensionDiag(unsigned DiagID, bool &EnabledByDefault); - /// Given a group ID, returns the flag that toggles the group. - /// For example, for Group::DeprecatedDeclarations, returns - /// "deprecated-declarations". - static StringRef getWarningOptionForGroup(diag::Group); /// Return the lowest-level warning option that enables the specified /// diagnostic. diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 1d4ea92..a3944f7 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -3396,7 +3396,7 @@ def warn_attribute_dllimport_static_field_definition : Warning< InGroup>; def warn_attribute_dllexport_explicit_instantiation_decl : Warning< "explicit instantiation declaration should not be 'dllexport'">, - InGroup; + InGroup>; def warn_attribute_dllexport_explicit_instantiation_def : Warning< "'dllexport' attribute ignored on explicit instantiation definition">, InGroup; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index f2c119a..f042070 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6106,7 +6106,16 @@ def _SLASH_WX_ : CLFlag<"WX-">, HelpText<"Do not treat warnings as errors (default)">, Alias, AliasArgs<["no-error"]>; def _SLASH_w_flag : CLFlag<"w">, HelpText<"Disable all warnings">, Alias; -def _SLASH_wd : CLCompileJoined<"wd">; +def _SLASH_wd4005 : CLFlag<"wd4005">, Alias, + AliasArgs<["no-macro-redefined"]>; +def _SLASH_wd4018 : CLFlag<"wd4018">, Alias, + AliasArgs<["no-sign-compare"]>; +def _SLASH_wd4100 : CLFlag<"wd4100">, Alias, + AliasArgs<["no-unused-parameter"]>; +def _SLASH_wd4910 : CLFlag<"wd4910">, Alias, + AliasArgs<["no-dllexport-explicit-instantiation-decl"]>; +def _SLASH_wd4996 : CLFlag<"wd4996">, Alias, + AliasArgs<["no-deprecated-declarations"]>; def _SLASH_vd : CLJoined<"vd">, HelpText<"Control vtordisp placement">, Alias; def _SLASH_X : CLFlag<"X">, diff --git a/clang/lib/Basic/CLWarnings.cpp b/clang/lib/Basic/CLWarnings.cpp deleted file mode 100644 index 0cf367d..0000000 --- a/clang/lib/Basic/CLWarnings.cpp +++ /dev/null @@ -1,28 +0,0 @@ -//===--- 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 -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 {}; -} diff --git a/clang/lib/Basic/CMakeLists.txt b/clang/lib/Basic/CMakeLists.txt index 40de943..d440f3b3 100644 --- a/clang/lib/Basic/CMakeLists.txt +++ b/clang/lib/Basic/CMakeLists.txt @@ -39,7 +39,6 @@ endif() add_clang_library(clangBasic Attributes.cpp Builtins.cpp - CLWarnings.cpp CharInfo.cpp CodeGenOptions.cpp Cuda.cpp diff --git a/clang/lib/Basic/Diagnostic.cpp b/clang/lib/Basic/Diagnostic.cpp index 1b779af..d3b2122 100644 --- a/clang/lib/Basic/Diagnostic.cpp +++ b/clang/lib/Basic/Diagnostic.cpp @@ -408,14 +408,6 @@ bool DiagnosticsEngine::setSeverityForGroup(diag::Flavor Flavor, return false; } -bool DiagnosticsEngine::setSeverityForGroup(diag::Flavor Flavor, - diag::Group Group, - diag::Severity Map, - SourceLocation Loc) { - return setSeverityForGroup(Flavor, Diags->getWarningOptionForGroup(Group), - Map, Loc); -} - bool DiagnosticsEngine::setDiagnosticGroupWarningAsError(StringRef Group, bool Enabled) { // If we are enabling this feature, just set the diagnostic mappings to map to diff --git a/clang/lib/Basic/DiagnosticIDs.cpp b/clang/lib/Basic/DiagnosticIDs.cpp index 88801c6..c333076 100644 --- a/clang/lib/Basic/DiagnosticIDs.cpp +++ b/clang/lib/Basic/DiagnosticIDs.cpp @@ -609,23 +609,17 @@ namespace { // Second the table of options, sorted by name for fast binary lookup. static const WarningOption OptionTable[] = { -#define DIAG_ENTRY(GroupName, FlagNameOffset, Members, SubGroups) \ - {FlagNameOffset, Members, SubGroups}, +#define GET_DIAG_TABLE #include "clang/Basic/DiagnosticGroups.inc" -#undef DIAG_ENTRY +#undef GET_DIAG_TABLE }; -StringRef DiagnosticIDs::getWarningOptionForGroup(diag::Group Group) { - return OptionTable[static_cast(Group)].getName(); -} - /// getWarningOptionForDiag - Return the lowest-level warning option that /// enables the specified diagnostic. If there is no -Wfoo flag that controls /// the diagnostic, this returns null. StringRef DiagnosticIDs::getWarningOptionForDiag(unsigned DiagID) { if (const StaticDiagInfoRec *Info = GetDiagInfo(DiagID)) - return getWarningOptionForGroup( - static_cast(Info->getOptionGroupIndex())); + return OptionTable[Info->getOptionGroupIndex()].getName(); return StringRef(); } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 9450e8b..23932bf 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -22,7 +22,6 @@ #include "Hexagon.h" #include "MSP430.h" #include "PS4CPU.h" -#include "clang/Basic/CLWarnings.h" #include "clang/Basic/CharInfo.h" #include "clang/Basic/CodeGenOptions.h" #include "clang/Basic/LangOptions.h" @@ -5439,26 +5438,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, Args.AddAllArgs(CmdArgs, options::OPT_R_Group); - for (const Arg *A : - Args.filtered(options::OPT_W_Group, options::OPT__SLASH_wd)) { - A->claim(); - if (A->getOption().getID() == options::OPT__SLASH_wd) { - unsigned WarningNumber; - if (StringRef(A->getValue()).getAsInteger(10, WarningNumber)) { - D.Diag(diag::err_drv_invalid_int_value) - << A->getAsString(Args) << A->getValue(); - continue; - } - - if (auto Group = diagGroupFromCLWarningID(WarningNumber)) { - CmdArgs.push_back(Args.MakeArgString( - "-Wno-" + DiagnosticIDs::getWarningOptionForGroup(*Group))); - continue; - } - } - A->render(Args, CmdArgs); - } - + Args.AddAllArgs(CmdArgs, options::OPT_W_Group); if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false)) CmdArgs.push_back("-pedantic"); Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors); diff --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp index 3cbe16e..df3080a 100644 --- a/clang/lib/Lex/Pragma.cpp +++ b/clang/lib/Lex/Pragma.cpp @@ -12,7 +12,6 @@ //===----------------------------------------------------------------------===// #include "clang/Lex/Pragma.h" -#include "clang/Basic/CLWarnings.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticLex.h" #include "clang/Basic/FileManager.h" @@ -1414,15 +1413,12 @@ struct PragmaWarningHandler : public PragmaHandler { return; } } - PP.getDiagnostics().pushMappings(DiagLoc); if (Callbacks) Callbacks->PragmaWarningPush(DiagLoc, Level); } else if (II && II->isStr("pop")) { // #pragma warning( pop ) PP.Lex(Tok); - if (!PP.getDiagnostics().popMappings(DiagLoc)) - PP.Diag(Tok, diag::warn_pragma_diagnostic_cannot_pop); - else if (Callbacks) + if (Callbacks) Callbacks->PragmaWarningPop(DiagLoc); } else { // #pragma warning( warning-specifier : warning-number-list @@ -1486,22 +1482,6 @@ struct PragmaWarningHandler : public PragmaHandler { } Ids.push_back(int(Value)); } - - // Only act on disable for now. - diag::Severity SV = diag::Severity(); - if (Specifier == PPCallbacks::PWS_Disable) - SV = diag::Severity::Ignored; - if (SV != diag::Severity()) - for (int Id : Ids) { - if (auto Group = diagGroupFromCLWarningID(Id)) { - bool unknownDiag = PP.getDiagnostics().setSeverityForGroup( - diag::Flavor::WarningOrError, *Group, SV, DiagLoc); - assert(!unknownDiag && - "wd table should only contain known diags"); - (void)unknownDiag; - } - } - if (Callbacks) Callbacks->PragmaWarning(DiagLoc, Specifier, Ids); diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index 74dd687..a5e1402 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -353,7 +353,7 @@ // CHECK-C11: -std=c11 // For some warning ids, we can map from MSVC warning to Clang warning. -// RUN: %clang_cl -wd4005 -wd4100 -wd4910 -wd4996 -wd12345678 -### -- %s 2>&1 | FileCheck -check-prefix=Wno %s +// RUN: %clang_cl -wd4005 -wd4100 -wd4910 -wd4996 -### -- %s 2>&1 | FileCheck -check-prefix=Wno %s // Wno: "-cc1" // Wno: "-Wno-macro-redefined" // Wno: "-Wno-unused-parameter" diff --git a/clang/test/Sema/pragma-warning.cpp b/clang/test/Sema/pragma-warning.cpp deleted file mode 100644 index a36ecbd..0000000 --- a/clang/test/Sema/pragma-warning.cpp +++ /dev/null @@ -1,24 +0,0 @@ -// RUN: %clang_cc1 -triple x86_64-pc-windows-msvc -fms-extensions -fsyntax-only -verify %s - -[[deprecated]] void f() {} // expected-note 2 {{marked deprecated here}} - -#define From__pragma() \ - __pragma(warning(push)) \ - __pragma(warning(disable:4996)) \ - f(); \ - __pragma(warning(pop)) - -void g() { - f(); // expected-warning {{deprecated}} - -#pragma warning(push) -#pragma warning(disable: 4996) - f(); // no diag - -#pragma warning(disable: 49960000) -#pragma warning(pop) - - f(); // expected-warning {{deprecated}} - - From__pragma(); // no diag -} diff --git a/clang/tools/diagtool/DiagnosticNames.cpp b/clang/tools/diagtool/DiagnosticNames.cpp index 55b308e..c54f814 100644 --- a/clang/tools/diagtool/DiagnosticNames.cpp +++ b/clang/tools/diagtool/DiagnosticNames.cpp @@ -66,10 +66,9 @@ const DiagnosticRecord &diagtool::getDiagnosticForID(short DiagID) { // Second the table of options, sorted by name for fast binary lookup. static const GroupRecord OptionTable[] = { -#define DIAG_ENTRY(GroupName, FlagNameOffset, Members, SubGroups) \ - {FlagNameOffset, Members, SubGroups}, +#define GET_DIAG_TABLE #include "clang/Basic/DiagnosticGroups.inc" -#undef DIAG_ENTRY +#undef GET_DIAG_TABLE }; llvm::StringRef GroupRecord::getName() const { diff --git a/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp b/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp index 547ec2c..ad4bb8d 100644 --- a/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp +++ b/clang/utils/TableGen/ClangDiagnosticsEmitter.cpp @@ -129,7 +129,6 @@ namespace { }; struct GroupInfo { - llvm::StringRef GroupName; std::vector DiagsInGroup; std::vector SubGroups; unsigned IDNo; @@ -175,7 +174,6 @@ static void groupDiagnostics(const std::vector &Diags, Record *Group = DiagGroups[i]; GroupInfo &GI = DiagsInGroup[std::string(Group->getValueAsString("GroupName"))]; - GI.GroupName = Group->getName(); GI.Defs.push_back(Group); std::vector SubGroups = Group->getValueAsListOfDefs("SubGroups"); @@ -1281,8 +1279,8 @@ void clang::EmitClangDiagsDefs(RecordKeeper &Records, raw_ostream &OS, OS << ", \""; OS.write_escaped(DiagTextBuilder.buildForDefinition(&R)) << '"'; - // Warning group associated with the diagnostic. This is stored as an index - // into the alphabetically sorted warning group table. + // Warning associated with the diagnostic. This is stored as an index into + // the alphabetically sorted warning table. if (DefInit *DI = dyn_cast(R.getValueInit("Group"))) { std::map::iterator I = DiagsInGroup.find( std::string(DI->getDef()->getValueAsString("GroupName"))); @@ -1489,20 +1487,18 @@ static void emitDiagTable(std::map &DiagsInGroup, for (auto const &I: DiagsInGroup) MaxLen = std::max(MaxLen, (unsigned)I.first.size()); - OS << "\n#ifdef DIAG_ENTRY\n"; + OS << "\n#ifdef GET_DIAG_TABLE\n"; unsigned SubGroupIndex = 1, DiagArrayIndex = 1; for (auto const &I: DiagsInGroup) { // Group option string. - OS << "DIAG_ENTRY("; - OS << I.second.GroupName << " /* "; - + OS << " { /* "; if (I.first.find_first_not_of("abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "0123456789!@#$%^*-+=:?") != std::string::npos) PrintFatalError("Invalid character in diagnostic group '" + I.first + "'"); - OS << I.first << " */, "; + OS << I.first << " */ " << std::string(MaxLen - I.first.size(), ' '); // Store a pascal-style length byte at the beginning of the string. std::string Name = char(I.first.size()) + I.first; OS << GroupNames.GetOrAddStringOffset(Name, false) << ", "; @@ -1521,7 +1517,7 @@ static void emitDiagTable(std::map &DiagsInGroup, DiagArrayIndex += DiagsInPedantic.size(); DiagArrayIndex += V.size() + 1; } else { - OS << "0, "; + OS << "/* Empty */ 0, "; } // Subgroups. @@ -1534,12 +1530,12 @@ static void emitDiagTable(std::map &DiagsInGroup, SubGroupIndex += GroupsInPedantic.size(); SubGroupIndex += SubGroups.size() + 1; } else { - OS << "0"; + OS << "/* Empty */ 0"; } - OS << ")\n"; + OS << " },\n"; } - OS << "#endif // DIAG_ENTRY\n\n"; + OS << "#endif // GET_DIAG_TABLE\n\n"; } /// Emit the table of diagnostic categories. diff --git a/llvm/utils/gn/secondary/clang/lib/Basic/BUILD.gn b/llvm/utils/gn/secondary/clang/lib/Basic/BUILD.gn index 09afa57..88c10d4 100644 --- a/llvm/utils/gn/secondary/clang/lib/Basic/BUILD.gn +++ b/llvm/utils/gn/secondary/clang/lib/Basic/BUILD.gn @@ -55,7 +55,6 @@ static_library("Basic") { sources = [ "Attributes.cpp", "Builtins.cpp", - "CLWarnings.cpp", "CharInfo.cpp", "CodeGenOptions.cpp", "Cuda.cpp", -- 2.7.4