Index: cfe/trunk/lib/Driver/Driver.cpp =================================================================== --- cfe/trunk/lib/Driver/Driver.cpp +++ cfe/trunk/lib/Driver/Driver.cpp @@ -1297,7 +1297,7 @@ std::sort(SuggestedCompletions.begin(), SuggestedCompletions.end(), [](StringRef A, StringRef B) { return A.compare_lower(B) < 0; }); - llvm::outs() << llvm::join(SuggestedCompletions, " ") << '\n'; + llvm::outs() << llvm::join(SuggestedCompletions, "\n") << '\n'; return false; } Index: cfe/trunk/test/Driver/autocomplete.c =================================================================== --- cfe/trunk/test/Driver/autocomplete.c +++ cfe/trunk/test/Driver/autocomplete.c @@ -1,46 +1,91 @@ // RUN: %clang --autocomplete=-fsyn | FileCheck %s -check-prefix=FSYN // FSYN: -fsyntax-only -// RUN: %clang --autocomplete=-s | FileCheck %s -check-prefix=STD -// STD: -std={{.*}}-stdlib= +// RUN: %clang --autocomplete=-std= | FileCheck %s -check-prefix=STD +// STD: -std= Language standard to compile for // RUN: %clang --autocomplete=foo | FileCheck %s -check-prefix=FOO // FOO-NOT: foo // RUN: %clang --autocomplete=-stdlib=,l | FileCheck %s -check-prefix=STDLIB -// STDLIB: libc++ libstdc++ +// STDLIB: libc++ +// STDLIB-NEXT: libstdc++ // RUN: %clang --autocomplete=-stdlib=, | FileCheck %s -check-prefix=STDLIBALL -// STDLIBALL: libc++ libstdc++ platform +// STDLIBALL: libc++ +// STDLIBALL-NEXT: libstdc++ +// STDLIBALL-NEXT: platform // RUN: %clang --autocomplete=-meabi,d | FileCheck %s -check-prefix=MEABI // MEABI: default // RUN: %clang --autocomplete=-meabi, | FileCheck %s -check-prefix=MEABIALL -// MEABIALL: 4 5 default gnu +// MEABIALL: 4 +// MEABIALL-NEXT: 5 +// MEABIALL-NEXT: default +// MEABIALL-NEXT: gnu // RUN: %clang --autocomplete=-cl-std=,CL2 | FileCheck %s -check-prefix=CLSTD // CLSTD: CL2.0 // RUN: %clang --autocomplete=-cl-std=, | FileCheck %s -check-prefix=CLSTDALL -// CLSTDALL: cl CL cl1.1 CL1.1 cl1.2 CL1.2 cl2.0 CL2.0 +// CLSTDALL: cl +// CLSTDALL-NEXT: CL +// CLSTDALL-NEXT: cl1.1 +// CLSTDALL-NEXT: CL1.1 +// CLSTDALL-NEXT: cl1.2 +// CLSTDALL-NEXT: CL1.2 +// CLSTDALL-NEXT: cl2.0 +// CLSTDALL-NEXT: CL2.0 // RUN: %clang --autocomplete=-fno-sanitize-coverage=,f | FileCheck %s -check-prefix=FNOSANICOVER // FNOSANICOVER: func // RUN: %clang --autocomplete=-fno-sanitize-coverage=, | FileCheck %s -check-prefix=FNOSANICOVERALL -// FNOSANICOVERALL: 8bit-counters bb edge func indirect-calls inline-8bit-counters no-prune trace-bb trace-cmp trace-div trace-gep trace-pc trace-pc-guard +// FNOSANICOVERALL: 8bit-counters +// FNOSANICOVERALL-NEXT: bb +// FNOSANICOVERALL-NEXT: edge +// FNOSANICOVERALL-NEXT: func +// FNOSANICOVERALL-NEXT: indirect-calls +// FNOSANICOVERALL-NEXT: inline-8bit-counters +// FNOSANICOVERALL-NEXT: no-prune +// FNOSANICOVERALL-NEXT: trace-bb +// FNOSANICOVERALL-NEXT: trace-cmp +// FNOSANICOVERALL-NEXT: trace-div +// FNOSANICOVERALL-NEXT: trace-gep +// FNOSANICOVERALL-NEXT: trace-pc +// FNOSANICOVERALL-NEXT: trace-pc-guard // RUN: %clang --autocomplete=-ffp-contract=, | FileCheck %s -check-prefix=FFPALL -// FFPALL: fast off on +// FFPALL: fast +// FFPALL-NEXT: off +// FFPALL-NEXT: on // RUN: %clang --autocomplete=-flto=, | FileCheck %s -check-prefix=FLTOALL -// FLTOALL: full thin +// FLTOALL: full +// FLTOALL-NEXT: thin // RUN: %clang --autocomplete=-fveclib=, | FileCheck %s -check-prefix=FVECLIBALL -// FVECLIBALL: Accelerate none SVML +// FVECLIBALL: Accelerate +// FVECLIBALL-NEXT: none +// FVECLIBALL-NEXT: SVML // RUN: %clang --autocomplete=-fshow-overloads=, | FileCheck %s -check-prefix=FSOVERALL -// FSOVERALL: all best +// FSOVERALL: all +// FSOVERALL-NEXT: best // RUN: %clang --autocomplete=-fvisibility=, | FileCheck %s -check-prefix=FVISIBILITYALL -// FVISIBILITYALL: default hidden +// FVISIBILITYALL: default +// FVISIBILITYALL-NEXT: hidden // RUN: %clang --autocomplete=-mfloat-abi=, | FileCheck %s -check-prefix=MFLOATABIALL -// MFLOATABIALL: hard soft softfp +// MFLOATABIALL: hard +// MFLOATABIALL-NEXT: soft +// MFLOATABIALL-NEXT: softfp // RUN: %clang --autocomplete=-mthread-model, | FileCheck %s -check-prefix=MTHREADMODELALL -// MTHREADMODELALL: posix single +// MTHREADMODELALL: posix +// MTHREADMODELALL-NEXT: single // RUN: %clang --autocomplete=-mrelocation-model, | FileCheck %s -check-prefix=MRELOCMODELALL -// MRELOCMODELALL: dynamic-no-pic pic ropi ropi-rwpi rwpi static +// MRELOCMODELALL: dynamic-no-pic +// MRELOCMODELALL-NEXT: pic +// MRELOCMODELALL-NEXT: ropi +// MRELOCMODELALL-NEXT: ropi-rwpi +// MRELOCMODELALL-NEXT: rwpi +// MRELOCMODELALL-NEXT: static // RUN: %clang --autocomplete=-mrelocation-mode | FileCheck %s -check-prefix=MRELOCMODEL_CLANG // MRELOCMODEL_CLANG-NOT: -mrelocation-model // RUN: %clang --autocomplete=#-mrelocation-mode | FileCheck %s -check-prefix=MRELOCMODEL_CC1 // MRELOCMODEL_CC1: -mrelocation-model // RUN: %clang --autocomplete=-Wma | FileCheck %s -check-prefix=WARNING -// WARNING: -Wmacro-redefined -Wmain -Wmain-return-type -Wmalformed-warning-check -Wmany-braces-around-scalar-init -Wmax-unsigned-zero +// WARNING: -Wmacro-redefined +// WARNING-NEXT: -Wmain +// WARNING-NEXT: -Wmain-return-type +// WARNING-NEXT: -Wmalformed-warning-check +// WARNING-NEXT: -Wmany-braces-around-scalar-init +// WARNING-NEXT: -Wmax-unsigned-zero // RUN: %clang --autocomplete=-Wno-invalid-pp- | FileCheck %s -check-prefix=NOWARNING // NOWARNING: -Wno-invalid-pp-token Index: cfe/trunk/utils/bash-autocomplete.sh =================================================================== --- cfe/trunk/utils/bash-autocomplete.sh +++ cfe/trunk/utils/bash-autocomplete.sh @@ -57,7 +57,7 @@ # expand ~ to $HOME eval local path=${COMP_WORDS[0]} - flags=$( "$path" --autocomplete="$arg" 2>/dev/null ) + flags=$( "$path" --autocomplete="$arg" 2>/dev/null | sed -e 's/\t.*//' ) # If clang is old that it does not support --autocomplete, # fall back to the filename completion. if [[ "$?" != 0 ]]; then Index: llvm/trunk/lib/Option/OptTable.cpp =================================================================== --- llvm/trunk/lib/Option/OptTable.cpp +++ llvm/trunk/lib/Option/OptTable.cpp @@ -235,7 +235,9 @@ continue; for (int I = 0; In.Prefixes[I]; I++) { - std::string S = std::string(In.Prefixes[I]) + std::string(In.Name); + std::string S = std::string(In.Prefixes[I]) + std::string(In.Name) + "\t"; + if (In.HelpText) + S += In.HelpText; if (StringRef(S).startswith(Cur)) Ret.push_back(S); }