<div class="gmail_quote">On Sat, Apr 23, 2011 at 8:08 AM, Douglas Gregor <span dir="ltr"><<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5"><br>
On Apr 23, 2011, at 2:27 AM, Chandler Carruth wrote:<br>
<br>
> Author: chandlerc<br>
> Date: Sat Apr 23 04:27:53 2011<br>
> New Revision: 130055<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=130055&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=130055&view=rev</a><br>
> Log:<br>
> Fix Clang's __DEPRECATED define to be controled by -Wdeprecated. This<br>
> matches GCC behavior which libstdc++ uses to limit #warning-based<br>
> messages about deprecation.<br>
><br>
> The machinery involves threading this through a new '-fdeprecated-macro'<br>
> flag for CC1. The flag defaults to "on", similarly to -Wdeprecated. We<br>
> turn the flag off in the driver when the warning is turned off (modulo<br>
> matching some GCC bugs). We record this as a language option, and key<br>
> the preprocessor on the option when introducing the define.<br>
><br>
> A separate flag rather than a '-D' flag allows us to properly represent<br>
> the difference between C and C++ builds (only C++ receives the define),<br>
> and it allows the specific behavior of following -Wdeprecated without<br>
> potentially impacting the set of user-provided macro flags.<br>
><br>
> Modified:<br>
>    cfe/trunk/include/clang/Basic/LangOptions.h<br>
>    cfe/trunk/include/clang/Driver/CC1Options.td<br>
>    cfe/trunk/include/clang/Driver/Options.td<br>
>    cfe/trunk/lib/Driver/Tools.cpp<br>
>    cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
>    cfe/trunk/lib/Frontend/InitPreprocessor.cpp<br>
>    cfe/trunk/test/Driver/clang_f_opts.c<br>
><br>
> Modified: cfe/trunk/include/clang/Basic/LangOptions.h<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.h?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Basic/LangOptions.h (original)<br>
> +++ cfe/trunk/include/clang/Basic/LangOptions.h Sat Apr 23 04:27:53 2011<br>
> @@ -89,6 +89,8 @@<br>
>                                   // used (instead of C99 semantics).<br>
>   unsigned NoInline          : 1; // Should __NO_INLINE__ be defined.<br>
><br>
> +  unsigned Deprecated        : 1; // Should __DEPRECATED be defined.<br>
> +<br>
>   unsigned ObjCGCBitmapPrint : 1; // Enable printing of gc's bitmap layout<br>
>                                   // for __weak/__strong ivars.<br>
><br>
> @@ -213,6 +215,8 @@<br>
>     GNUInline = 0;<br>
>     NoInline = 0;<br>
><br>
> +    Deprecated = 1;  // -Wdeprecated defaults to "on".<br>
> +<br>
>     CharIsSigned = 1;<br>
>     ShortWChar = 0;<br>
>     ShortEnums = 0;<br>
<br>
</div></div>The Deprecated bit needs to be read/written by the ASTReader/ASTWriter.<br></blockquote><div><br></div><div>Doh, forgot about that. Fixed in r130071.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="im"><br>
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)<br>
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Sat Apr 23 04:27:53 2011<br>
> @@ -539,6 +539,10 @@<br>
>            "translation unit ">;<br>
> def funknown_anytype : Flag<"-funknown-anytype">,<br>
>   HelpText<"Enable parser support for the __unknown_anytype type; for testing purposes only">;<br>
> +def fdeprecated_macro : Flag<"-fdeprecated-macro">,<br>
> +  HelpText<"Defines the __DEPRECATED macro in C++ compilations">;<br>
> +def fno_deprecated_macro : Flag<"-fno-deprecated-macro">,<br>
> +  HelpText<"Undefines the __DEPRECATED macro in C++ compilations">;<br>
<br>
</div>It seems like -fdeprecated-macro should always define __DEPRECATED, and it's the driver that should do the language-based decision of whether to add it.<br></blockquote><div><br></div><div>Sure, hoisted this logic up into the driver in r130066. I had thought it would make the logic ugly, but its actually pretty clean. Thanks for the suggestion.</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5"><br>
> //===----------------------------------------------------------------------===//<br>
> // Header Search Options<br>
><br>
> Modified: cfe/trunk/include/clang/Driver/Options.td<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/Options.td?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/include/clang/Driver/Options.td (original)<br>
> +++ cfe/trunk/include/clang/Driver/Options.td Sat Apr 23 04:27:53 2011<br>
> @@ -166,6 +166,8 @@<br>
>   HelpText<"Pass the comma separated arguments in <arg> to the assembler">,<br>
>   MetaVarName<"<arg>">;<br>
> def Wall : Flag<"-Wall">, Group<W_Group>;<br>
> +def Wdeprecated : Flag<"-Wdeprecated">, Group<W_Group>;<br>
> +def Wno_deprecated : Flag<"-Wno-deprecated">, Group<W_Group>;<br>
> def Wextra : Flag<"-Wextra">, Group<W_Group>;<br>
> def Wl_COMMA : CommaJoined<"-Wl,">, Flags<[LinkerInput, RenderAsInput]>,<br>
>   HelpText<"Pass the comma separated arguments in <arg> to the linker">,<br>
><br>
> Modified: cfe/trunk/lib/Driver/Tools.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Driver/Tools.cpp (original)<br>
> +++ cfe/trunk/lib/Driver/Tools.cpp Sat Apr 23 04:27:53 2011<br>
> @@ -1362,6 +1362,17 @@<br>
>     CmdArgs.push_back("-fconst-strings");<br>
>   }<br>
><br>
> +  // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active<br>
> +  // during C++ compilation. CC1 uses '-fdeprecated-macro' to control this.<br>
> +  // Both '-Wdeprecated' and '-fdeprecated-macro' default to on, so the flag<br>
> +  // logic here is inverted.<br>
> +  if (Args.hasFlag(options::OPT_Wno_deprecated, options::OPT_Wdeprecated,<br>
> +                   false)) {<br>
> +    // GCC keeps this define even in the presence of '-w', match this behavior<br>
> +    // bug-for-bug.<br>
> +    CmdArgs.push_back("-fno-deprecated-macro");<br>
> +  }<br>
> +<br>
>   // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.<br>
>   if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {<br>
>     if (Asm->getOption().matches(options::OPT_fasm))<br>
><br>
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)<br>
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Sat Apr 23 04:27:53 2011<br>
> @@ -694,6 +694,8 @@<br>
>     Res.push_back("-funknown-anytype");<br>
>   if (Opts.DelayedTemplateParsing)<br>
>     Res.push_back("-fdelayed-template-parsing");<br>
> +  if (!Opts.Deprecated)<br>
> +    Res.push_back("-fno-deprecated-macro");<br>
> }<br>
><br>
> static void PreprocessorOptsToArgs(const PreprocessorOptions &Opts,<br>
> @@ -1528,6 +1530,11 @@<br>
>   Opts.FakeAddressSpaceMap = Args.hasArg(OPT_ffake_address_space_map);<br>
>   Opts.ParseUnknownAnytype = Args.hasArg(OPT_funknown_anytype);<br>
><br>
> +  // Record whether the __DEPRECATED define was requested.<br>
> +  Opts.Deprecated = Args.hasFlag(OPT_fdeprecated_macro,<br>
> +                                 OPT_fno_deprecated_macro,<br>
> +                                 Opts.Deprecated);<br>
> +<br>
>   // FIXME: Eliminate this dependency.<br>
>   unsigned Opt = getOptimizationLevel(Args, IK, Diags);<br>
>   Opts.Optimize = Opt != 0;<br>
><br>
> Modified: cfe/trunk/lib/Frontend/InitPreprocessor.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/InitPreprocessor.cpp?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/lib/Frontend/InitPreprocessor.cpp (original)<br>
> +++ cfe/trunk/lib/Frontend/InitPreprocessor.cpp Sat Apr 23 04:27:53 2011<br>
> @@ -319,7 +319,8 @@<br>
>     Builder.defineMacro("__USING_SJLJ_EXCEPTIONS__");<br>
><br>
>   if (LangOpts.CPlusPlus) {<br>
> -    Builder.defineMacro("__DEPRECATED");<br>
> +    if (LangOpts.Deprecated)<br>
> +      Builder.defineMacro("__DEPRECATED");<br>
>     Builder.defineMacro("__GNUG__", "4");<br>
>     Builder.defineMacro("__GXX_WEAK__");<br>
>     if (LangOpts.GNUMode)<br>
><br>
> Modified: cfe/trunk/test/Driver/clang_f_opts.c<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/clang_f_opts.c?rev=130055&r1=130054&r2=130055&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/clang_f_opts.c?rev=130055&r1=130054&r2=130055&view=diff</a><br>

> ==============================================================================<br>
> --- cfe/trunk/test/Driver/clang_f_opts.c (original)<br>
> +++ cfe/trunk/test/Driver/clang_f_opts.c Sat Apr 23 04:27:53 2011<br>
> @@ -19,3 +19,11 @@<br>
> // WRITE-STRINGS2-NOT: -fconst-strings<br>
> // RUN: %clang -### -S -Wwrite-strings -w %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS3 %s<br>
> // WRITE-STRINGS3: -fconst-strings<br>
> +<br>
> +// RUN: %clang -### -c %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s<br>
> +// RUN: %clang -### -c -Wdeprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s<br>
> +// RUN: %clang -### -c -Wno-deprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-OFF-CHECK %s<br>
> +// RUN: %clang -### -c -Wno-deprecated -Wdeprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s<br>
> +// RUN: %clang -### -c -w %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s<br>
> +// DEPRECATED-OFF-CHECK: -fno-deprecated-macro<br>
> +// DEPRECATED-ON-CHECK-NOT: -fno-deprecated-macro<br>
><br>
><br>
> _______________________________________________<br>
> cfe-commits mailing list<br>
> <a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</div></div></blockquote></div><br>