Index: clang/lib/Driver/Driver.cpp =================================================================== --- clang/lib/Driver/Driver.cpp +++ clang/lib/Driver/Driver.cpp @@ -1508,6 +1508,13 @@ unsigned short DisableFlags = options::NoDriverOption | options::Unsupported | options::Ignored; + // Distinguish "--autocomplete=-someflag" and "--autocomplete=-someflag," + // because the latter indicates that the user put space before pushing tab + // which should end up in a file completion. + bool HasSpace = false; + if (PassedFlags.endswith(",")) + HasSpace = true; + // Parse PassedFlags by "," as all the command-line flags are passed to this // function separated by "," StringRef TargetFlags = PassedFlags; @@ -1525,6 +1532,14 @@ StringRef Cur; Cur = Flags.at(Flags.size() - 1); + + // If Flags were empty, it means the user typed `clang [tab]` where we should + // list all possible flags. + if (HasSpace && !Flags.empty()) { + llvm::outs() << '\n'; + return; + } + StringRef Prev; if (Flags.size() >= 2) { Prev = Flags.at(Flags.size() - 2); Index: clang/test/Driver/autocomplete.c =================================================================== --- clang/test/Driver/autocomplete.c +++ clang/test/Driver/autocomplete.c @@ -121,3 +121,8 @@ // MODULE_FILE_EQUAL-NOT: -fmodule-file= // RUN: %clang --autocomplete=-fmodule-file | FileCheck %s -check-prefix=MODULE_FILE // MODULE_FILE: -fmodule-file= + +// RUN: %clang --autocomplete=-Qunused-arguments, | FileCheck %s -check-prefix=QUNUSED_COMMA +// QUNUSED_COMMA-NOT: -Qunused-arguments +// RUN: %clang --autocomplete=-Qunused-arguments | FileCheck %s -check-prefix=QUNUSED +// QUNUSED: -Qunused-arguments