From 1cfe3c305c0d5393fd94167808b8f5d96cd65227 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sat, 23 Apr 2011 09:27:53 +0000 Subject: [PATCH] Fix Clang's __DEPRECATED define to be controled by -Wdeprecated. This matches GCC behavior which libstdc++ uses to limit #warning-based messages about deprecation. The machinery involves threading this through a new '-fdeprecated-macro' flag for CC1. The flag defaults to "on", similarly to -Wdeprecated. We turn the flag off in the driver when the warning is turned off (modulo matching some GCC bugs). We record this as a language option, and key the preprocessor on the option when introducing the define. A separate flag rather than a '-D' flag allows us to properly represent the difference between C and C++ builds (only C++ receives the define), and it allows the specific behavior of following -Wdeprecated without potentially impacting the set of user-provided macro flags. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@130055 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/LangOptions.h | 4 ++++ include/clang/Driver/CC1Options.td | 4 ++++ include/clang/Driver/Options.td | 2 ++ lib/Driver/Tools.cpp | 11 +++++++++++ lib/Frontend/CompilerInvocation.cpp | 7 +++++++ lib/Frontend/InitPreprocessor.cpp | 3 ++- test/Driver/clang_f_opts.c | 8 ++++++++ 7 files changed, 38 insertions(+), 1 deletion(-) diff --git a/include/clang/Basic/LangOptions.h b/include/clang/Basic/LangOptions.h index 91287815cd..2b1319c1a0 100644 --- a/include/clang/Basic/LangOptions.h +++ b/include/clang/Basic/LangOptions.h @@ -89,6 +89,8 @@ public: // used (instead of C99 semantics). unsigned NoInline : 1; // Should __NO_INLINE__ be defined. + unsigned Deprecated : 1; // Should __DEPRECATED be defined. + unsigned ObjCGCBitmapPrint : 1; // Enable printing of gc's bitmap layout // for __weak/__strong ivars. @@ -213,6 +215,8 @@ public: GNUInline = 0; NoInline = 0; + Deprecated = 1; // -Wdeprecated defaults to "on". + CharIsSigned = 1; ShortWChar = 0; ShortEnums = 0; diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 442488bf87..716e27b903 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -539,6 +539,10 @@ def fdelayed_template_parsing : Flag<"-fdelayed-template-parsing">, "translation unit ">; def funknown_anytype : Flag<"-funknown-anytype">, HelpText<"Enable parser support for the __unknown_anytype type; for testing purposes only">; +def fdeprecated_macro : Flag<"-fdeprecated-macro">, + HelpText<"Defines the __DEPRECATED macro in C++ compilations">; +def fno_deprecated_macro : Flag<"-fno-deprecated-macro">, + HelpText<"Undefines the __DEPRECATED macro in C++ compilations">; //===----------------------------------------------------------------------===// // Header Search Options diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 06b3d347c0..b31da00eca 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -166,6 +166,8 @@ def Wa_COMMA : CommaJoined<"-Wa,">, HelpText<"Pass the comma separated arguments in to the assembler">, MetaVarName<"">; def Wall : Flag<"-Wall">, Group; +def Wdeprecated : Flag<"-Wdeprecated">, Group; +def Wno_deprecated : Flag<"-Wno-deprecated">, Group; def Wextra : Flag<"-Wextra">, Group; def Wl_COMMA : CommaJoined<"-Wl,">, Flags<[LinkerInput, RenderAsInput]>, HelpText<"Pass the comma separated arguments in to the linker">, diff --git a/lib/Driver/Tools.cpp b/lib/Driver/Tools.cpp index 436a2a42a4..f5dacfa6cf 100644 --- a/lib/Driver/Tools.cpp +++ b/lib/Driver/Tools.cpp @@ -1362,6 +1362,17 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-fconst-strings"); } + // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active + // during C++ compilation. CC1 uses '-fdeprecated-macro' to control this. + // Both '-Wdeprecated' and '-fdeprecated-macro' default to on, so the flag + // logic here is inverted. + if (Args.hasFlag(options::OPT_Wno_deprecated, options::OPT_Wdeprecated, + false)) { + // GCC keeps this define even in the presence of '-w', match this behavior + // bug-for-bug. + CmdArgs.push_back("-fno-deprecated-macro"); + } + // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'. if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) { if (Asm->getOption().matches(options::OPT_fasm)) diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 0dd2093b7a..daaaad0c2c 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -694,6 +694,8 @@ static void LangOptsToArgs(const LangOptions &Opts, Res.push_back("-funknown-anytype"); if (Opts.DelayedTemplateParsing) Res.push_back("-fdelayed-template-parsing"); + if (!Opts.Deprecated) + Res.push_back("-fno-deprecated-macro"); } static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts, @@ -1528,6 +1530,11 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map); Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype); + // Record whether the __DEPRECATED define was requested. + Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro, + OPT_fno_deprecated_macro, + Opts.Deprecated); + // FIXME: Eliminate this dependency. unsigned Opt = getOptimizationLevel(Args, IK, Diags); Opts.Optimize = Opt != 0; diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index ff3cf4b9cd..802d66ff0e 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -319,7 +319,8 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__"); if (LangOpts.CPlusPlus) { - Builder.defineMacro("__DEPRECATED"); + if (LangOpts.Deprecated) + Builder.defineMacro("__DEPRECATED"); Builder.defineMacro("__GNUG__", "4"); Builder.defineMacro("__GXX_WEAK__"); if (LangOpts.GNUMode) diff --git a/test/Driver/clang_f_opts.c b/test/Driver/clang_f_opts.c index 8d63ca8706..98952e60c1 100644 --- a/test/Driver/clang_f_opts.c +++ b/test/Driver/clang_f_opts.c @@ -19,3 +19,11 @@ // WRITE-STRINGS2-NOT: -fconst-strings // RUN: %clang -### -S -Wwrite-strings -w %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS3 %s // WRITE-STRINGS3: -fconst-strings + +// RUN: %clang -### -c %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s +// RUN: %clang -### -c -Wdeprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s +// RUN: %clang -### -c -Wno-deprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-OFF-CHECK %s +// RUN: %clang -### -c -Wno-deprecated -Wdeprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s +// RUN: %clang -### -c -w %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s +// DEPRECATED-OFF-CHECK: -fno-deprecated-macro +// DEPRECATED-ON-CHECK-NOT: -fno-deprecated-macro -- 2.40.0