qiucf created this revision. qiucf added reviewers: rsmith, hans, thakis, awarzynski, brad, phosek. qiucf requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
Things might be confusing for people not familiar with how this option works. Add this warning like GCC. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D116395 Files: clang/include/clang/Basic/DiagnosticDriverKinds.td clang/lib/Driver/Driver.cpp clang/test/Driver/redundant-args.c Index: clang/test/Driver/redundant-args.c =================================================================== --- clang/test/Driver/redundant-args.c +++ clang/test/Driver/redundant-args.c @@ -1,2 +1,4 @@ -// RUN: %clang -target x86_64-apple-darwin10 \ -// RUN: -Werror -x c -x c -fsyntax-only %s +// RUN: %clang -target x86_64-apple-darwin10 -Werror -x c -x c -fsyntax-only %s +// RUN: %clang -target x86_64-apple-darwin10 %s -### -x c 2>&1 | FileCheck %s + +// CHECK: warning: '-x c' after last input file has no effect Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -2269,6 +2269,7 @@ assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed"); } + size_t InputsBeforeOptX = 0; for (Arg *A : Args) { if (A->getOption().getKind() == Option::InputClass) { const char *Value = A->getValue(); @@ -2387,6 +2388,7 @@ InputTypeArg = A; InputType = types::lookupTypeForTypeSpecifier(A->getValue()); A->claim(); + InputsBeforeOptX = Inputs.size(); // Follow gcc behavior and treat as linker input for invalid -x // options. Its not clear why we shouldn't just revert to unknown; but @@ -2411,6 +2413,8 @@ Arg *A = MakeInputArg(Args, Opts, "-"); Inputs.push_back(std::make_pair(types::TY_C, A)); } + if (Inputs.size() == InputsBeforeOptX && InputTypeArg != nullptr) + Diag(diag::warn_drv_ignored_option_x) << InputTypeArg->getValue(0); } namespace { Index: clang/include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticDriverKinds.td +++ clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -568,6 +568,9 @@ "'%0' does not support '-%1'; flag ignored">, InGroup<OptionIgnored>; +def warn_drv_ignored_option_x : Warning< + "'-x %0' after last input file has no effect">, InGroup<OptionIgnored>; + def warn_drv_darwin_sdk_invalid_settings : Warning< "SDK settings were ignored as 'SDKSettings.json' could not be parsed">, InGroup<DiagGroup<"darwin-sdk-settings">>;
Index: clang/test/Driver/redundant-args.c =================================================================== --- clang/test/Driver/redundant-args.c +++ clang/test/Driver/redundant-args.c @@ -1,2 +1,4 @@ -// RUN: %clang -target x86_64-apple-darwin10 \ -// RUN: -Werror -x c -x c -fsyntax-only %s +// RUN: %clang -target x86_64-apple-darwin10 -Werror -x c -x c -fsyntax-only %s +// RUN: %clang -target x86_64-apple-darwin10 %s -### -x c 2>&1 | FileCheck %s + +// CHECK: warning: '-x c' after last input file has no effect Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -2269,6 +2269,7 @@ assert(!Args.hasArg(options::OPT_x) && "-x and /TC or /TP is not allowed"); } + size_t InputsBeforeOptX = 0; for (Arg *A : Args) { if (A->getOption().getKind() == Option::InputClass) { const char *Value = A->getValue(); @@ -2387,6 +2388,7 @@ InputTypeArg = A; InputType = types::lookupTypeForTypeSpecifier(A->getValue()); A->claim(); + InputsBeforeOptX = Inputs.size(); // Follow gcc behavior and treat as linker input for invalid -x // options. Its not clear why we shouldn't just revert to unknown; but @@ -2411,6 +2413,8 @@ Arg *A = MakeInputArg(Args, Opts, "-"); Inputs.push_back(std::make_pair(types::TY_C, A)); } + if (Inputs.size() == InputsBeforeOptX && InputTypeArg != nullptr) + Diag(diag::warn_drv_ignored_option_x) << InputTypeArg->getValue(0); } namespace { Index: clang/include/clang/Basic/DiagnosticDriverKinds.td =================================================================== --- clang/include/clang/Basic/DiagnosticDriverKinds.td +++ clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -568,6 +568,9 @@ "'%0' does not support '-%1'; flag ignored">, InGroup<OptionIgnored>; +def warn_drv_ignored_option_x : Warning< + "'-x %0' after last input file has no effect">, InGroup<OptionIgnored>; + def warn_drv_darwin_sdk_invalid_settings : Warning< "SDK settings were ignored as 'SDKSettings.json' could not be parsed">, InGroup<DiagGroup<"darwin-sdk-settings">>;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits