diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-08-06 04:09:06 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2012-08-06 04:09:06 +0000 |
commit | 04c3a25bd45ad8a6ad715783aee03df7284c5591 (patch) | |
tree | 7156f3c08f6f0c4f949ff549f9e9f203c1c1e6ff | |
parent | a4b39658673954fb9f75673594b50028685fc665 (diff) |
PR13529: Don't crash if the driver sees an unused input file when running as
'clang-cpp'.
For now, the test uses "REQUIRES: shell" to determine if the host system
supports "ln -s", which it uses to create a 'clang-cpp' symlink. This is a bit
hacky and should likely be directly supported by lit.cfg.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@161317 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticDriverKinds.td | 9 | ||||
-rw-r--r-- | lib/Driver/Driver.cpp | 17 | ||||
-rw-r--r-- | test/Driver/ccc-as-cpp.c | 6 | ||||
-rw-r--r-- | test/Misc/warning-flags.c | 4 |
4 files changed, 27 insertions, 9 deletions
diff --git a/include/clang/Basic/DiagnosticDriverKinds.td b/include/clang/Basic/DiagnosticDriverKinds.td index a73240b703..583b2345c9 100644 --- a/include/clang/Basic/DiagnosticDriverKinds.td +++ b/include/clang/Basic/DiagnosticDriverKinds.td @@ -105,9 +105,14 @@ def err_drv_unknown_objc_runtime : Error< def warn_c_kext : Warning< "ignoring -fapple-kext which is valid for C++ and Objective-C++ only">; def warn_drv_input_file_unused : Warning< - "%0: '%1' input unused when '%2' is present">; + "%0: '%1' input unused%select{ when '%3' is present|}2">, + InGroup<DiagGroup<"unused-command-line-argument">>; +def warn_drv_input_file_unused_by_cpp : Warning< + "%0: '%1' input unused in cpp mode">, + InGroup<DiagGroup<"unused-command-line-argument">>; def warn_drv_preprocessed_input_file_unused : Warning< - "%0: previously preprocessed input unused when '%1' is present">; + "%0: previously preprocessed input%select{ unused when '%2' is present|}1">, + InGroup<DiagGroup<"unused-command-line-argument">>; def warn_drv_unused_argument : Warning< "argument unused during compilation: '%0'">, InGroup<DiagGroup<"unused-command-line-argument">>; diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index 671c0acaab..1c47d5c9da 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -1131,18 +1131,27 @@ void Driver::BuildActions(const ToolChain &TC, const DerivedArgList &Args, if (Args.hasArg(options::OPT_Qunused_arguments)) continue; + // Special case when final phase determined by binary name, rather than + // by a command-line argument with a corresponding Arg. + if (CCCIsCPP) + Diag(clang::diag::warn_drv_input_file_unused_by_cpp) + << InputArg->getAsString(Args) + << getPhaseName(InitialPhase); // Special case '-E' warning on a previously preprocessed file to make // more sense. - if (InitialPhase == phases::Compile && FinalPhase == phases::Preprocess && - getPreprocessedType(InputType) == types::TY_INVALID) + else if (InitialPhase == phases::Compile && + FinalPhase == phases::Preprocess && + getPreprocessedType(InputType) == types::TY_INVALID) Diag(clang::diag::warn_drv_preprocessed_input_file_unused) << InputArg->getAsString(Args) - << FinalPhaseArg->getOption().getName(); + << !!FinalPhaseArg + << FinalPhaseArg ? FinalPhaseArg->getOption().getName() : ""; else Diag(clang::diag::warn_drv_input_file_unused) << InputArg->getAsString(Args) << getPhaseName(InitialPhase) - << FinalPhaseArg->getOption().getName(); + << !!FinalPhaseArg + << FinalPhaseArg ? FinalPhaseArg->getOption().getName() : ""; continue; } diff --git a/test/Driver/ccc-as-cpp.c b/test/Driver/ccc-as-cpp.c new file mode 100644 index 0000000000..feead5191d --- /dev/null +++ b/test/Driver/ccc-as-cpp.c @@ -0,0 +1,6 @@ +// REQUIRES: shell +// RUN: ln -sf %clang %T/clang-cpp + +// PR13529: Don't crash. +// RUN: %T/clang-cpp -lfoo -M %s 2>&1 | FileCheck --check-prefix=CHECK-PR13529 %s +// CHECK-PR13529: warning: -lfoo: 'linker' input unused in cpp mode diff --git a/test/Misc/warning-flags.c b/test/Misc/warning-flags.c index a63937bb24..98cfcd6741 100644 --- a/test/Misc/warning-flags.c +++ b/test/Misc/warning-flags.c @@ -18,7 +18,7 @@ This test serves two purposes: The list of warnings below should NEVER grow. It should gradually shrink to 0. -CHECK: Warnings without flags (130): +CHECK: Warnings without flags (128): CHECK-NEXT: pp_include_next_absolute_path CHECK-NEXT: pp_include_next_in_primary CHECK-NEXT: pp_invalid_string_literal @@ -51,13 +51,11 @@ CHECK-NEXT: warn_delete_array_type CHECK-NEXT: warn_double_const_requires_fp64 CHECK-NEXT: warn_drv_assuming_mfloat_abi_is CHECK-NEXT: warn_drv_clang_unsupported -CHECK-NEXT: warn_drv_input_file_unused CHECK-NEXT: warn_drv_not_using_clang_arch CHECK-NEXT: warn_drv_not_using_clang_cpp CHECK-NEXT: warn_drv_not_using_clang_cxx CHECK-NEXT: warn_drv_objc_gc_unsupported CHECK-NEXT: warn_drv_pch_not_first_include -CHECK-NEXT: warn_drv_preprocessed_input_file_unused CHECK-NEXT: warn_dup_category_def CHECK-NEXT: warn_duplicate_protocol_def CHECK-NEXT: warn_enum_too_large |