diff options
| -rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 | ||||
| -rw-r--r-- | clang/include/clang/Driver/Options.td | 2 | ||||
| -rw-r--r-- | clang/lib/Driver/Tools.cpp | 11 | ||||
| -rw-r--r-- | clang/test/Driver/clang_f_opts.c | 4 | ||||
| -rw-r--r-- | clang/test/PCH/different-diagnostic-level.c | 17 | 
5 files changed, 28 insertions, 8 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index c06a086eafe..b765677bdf0 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -4557,8 +4557,6 @@ def warn_deprecated_string_literal_conversion : Warning<  def ext_deprecated_string_literal_conversion : ExtWarn<    "ISO C++11 does not allow conversion from string literal to %0">,    InGroup<CXX11CompatDeprecatedWritableStr>, SFINAEFailure; -def warn_deprecated_string_literal_conversion_c : Warning< -  "dummy warning to enable -fconst-strings">, InGroup<DeprecatedWritableStr>, DefaultIgnore;  def err_realimag_invalid_type : Error<"invalid type %0 to %1 operator">;  def err_typecheck_sclass_fscope : Error<    "illegal storage class on file-scoped variable">; diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 731bb0406b3..d860d8f7dbc 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -279,6 +279,8 @@ def Wnonportable_cfstrings : Joined<["-"], "Wnonportable-cfstrings">, Group<W_Gr  def Wp_COMMA : CommaJoined<["-"], "Wp,">,    HelpText<"Pass the comma separated arguments in <arg> to the preprocessor">,    MetaVarName<"<arg>">; +def Wwrite_strings : Flag<["-"], "Wwrite-strings">, Group<W_Group>, Flags<[CC1Option]>; +def Wno_write_strings : Flag<["-"], "Wno-write-strings">, Group<W_Group>, Flags<[CC1Option]>;  def W_Joined : Joined<["-"], "W">, Group<W_Group>, Flags<[CC1Option, CoreOption]>,    MetaVarName<"<warning>">, HelpText<"Enable the specified warning">;  def Xanalyzer : Separate<["-"], "Xanalyzer">, diff --git a/clang/lib/Driver/Tools.cpp b/clang/lib/Driver/Tools.cpp index d0bcabf2154..d2bb9ba5327 100644 --- a/clang/lib/Driver/Tools.cpp +++ b/clang/lib/Driver/Tools.cpp @@ -21,7 +21,6 @@  #include "clang/Driver/SanitizerArgs.h"  #include "clang/Driver/ToolChain.h"  #include "clang/Driver/Util.h" -#include "clang/Sema/SemaDiagnostic.h"  #include "llvm/ADT/SmallString.h"  #include "llvm/ADT/StringExtras.h"  #include "llvm/ADT/StringSwitch.h" @@ -2881,9 +2880,13 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,    // behavior for now. FIXME: Directly diagnose uses of a string literal as    // a non-const char* in C, rather than using this crude hack.    if (!types::isCXX(InputType)) { -    DiagnosticsEngine::Level DiagLevel = D.getDiags().getDiagnosticLevel( -        diag::warn_deprecated_string_literal_conversion_c, SourceLocation()); -    if (DiagLevel > DiagnosticsEngine::Ignored) +    // FIXME: This should behave just like a warning flag, and thus should also +    // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on. +    Arg *WriteStrings = +        Args.getLastArg(options::OPT_Wwrite_strings, +                        options::OPT_Wno_write_strings, options::OPT_w); +    if (WriteStrings && +        WriteStrings->getOption().matches(options::OPT_Wwrite_strings))        CmdArgs.push_back("-fconst-strings");    } diff --git a/clang/test/Driver/clang_f_opts.c b/clang/test/Driver/clang_f_opts.c index 70826d7299f..e3be2eff9b5 100644 --- a/clang/test/Driver/clang_f_opts.c +++ b/clang/test/Driver/clang_f_opts.c @@ -15,11 +15,11 @@  // CHECK-OPTIONS2: -fno-show-source-location  // RUN: %clang -### -S -Wwrite-strings %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS1 %s -// RUN: %clang -### -S -Weverything %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS1 %s  // WRITE-STRINGS1: -fconst-strings  // RUN: %clang -### -S -Wwrite-strings -Wno-write-strings %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS2 %s -// RUN: %clang -### -S -Wwrite-strings -w %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS2 %s  // WRITE-STRINGS2-NOT: -fconst-strings +// RUN: %clang -### -S -Wwrite-strings -w %s 2>&1 | FileCheck -check-prefix=WRITE-STRINGS3 %s +// WRITE-STRINGS3-NOT: -fconst-strings  // RUN: %clang -### -x c++ -c %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s  // RUN: %clang -### -x c++ -c -Wdeprecated %s 2>&1 | FileCheck -check-prefix=DEPRECATED-ON-CHECK %s diff --git a/clang/test/PCH/different-diagnostic-level.c b/clang/test/PCH/different-diagnostic-level.c new file mode 100644 index 00000000000..ac1a0daab16 --- /dev/null +++ b/clang/test/PCH/different-diagnostic-level.c @@ -0,0 +1,17 @@ +// RUN: %clang -x c-header %s -Weverything -o %t.h.pch +// RUN: %clang -x c %s -w -include %t.h -fsyntax-only -Xclang -verify + +#ifndef HEADER +#define HEADER + +extern int foo; + +#else + +void f() { +  int a = foo; +  // Make sure we parsed this by getting an error. +  int b = bar; // expected-error {{undeclared}} +} + +#endif  | 

