diff --git a/llvm/test/FileCheck/dump-input-enable.txt b/llvm/test/FileCheck/dump-input-enable.txt --- a/llvm/test/FileCheck/dump-input-enable.txt +++ b/llvm/test/FileCheck/dump-input-enable.txt @@ -42,33 +42,32 @@ ; RUN: %ProtectFileCheckOutput FileCheck -dump-input=help \ ; RUN: | FileCheck %s -check-prefix=HELP -HELP-NOT: {{.}} -HELP: The following description was requested by -dump-input=help -HELP: try{{.*}}-color -HELP-NOT: {{.}} - ;-------------------------------------------------- ; Check -dump-input=never. ; ; Include the case without -v, which isn't covered elsewhere. ;-------------------------------------------------- +; FileCheck success, no -v => no dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=never 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -allow-empty \ ; RUN: -check-prefixes=NOTRACE,NODUMP +; FileCheck fail, no -v => no dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=never 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,ERR,NODUMP +; FileCheck success, -v => no dump, trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=never -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -check-prefixes=TRACE,NODUMP +; FileCheck fail, -v => no dump, trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=never -v 2>&1 \ @@ -78,11 +77,13 @@ ; Check no -dump-input, which defaults to never. ;-------------------------------------------------- +; FileCheck success, -v => no dump, trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -check-prefixes=TRACE,NODUMP +; FileCheck fail, -v => no dump, trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -v 2>&1 \ @@ -94,23 +95,27 @@ ; Include the case without -v, which isn't covered elsewhere. ;-------------------------------------------------- +; FileCheck success, no -v => no dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=fail 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -allow-empty \ ; RUN: -check-prefixes=NOTRACE,NODUMP +; FileCheck fail, no -v => dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=fail 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,ERR,DUMP-ERR +; FileCheck success, -v => no dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=fail -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -allow-empty \ ; RUN: -check-prefixes=NOTRACE,NODUMP +; FileCheck fail, -v => dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=fail -v 2>&1 \ @@ -121,24 +126,32 @@ ; Check -dump-input-on-failure. ;-------------------------------------------------- +; Command-line option. + +; FileCheck success, -v => no dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input-on-failure -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -allow-empty \ ; RUN: -check-prefixes=NOTRACE,NODUMP +; FileCheck fail, -v => dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input-on-failure -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines \ ; RUN: -check-prefixes=NOTRACE,ERR,DUMP-ERR,DUMP-ERR-V +; FILECHECK_DUMP_INPUT_ON_FAILURE=1. + +; FileCheck success, -v => no dump, no trace. ; RUN: %ProtectFileCheckOutput FILECHECK_DUMP_INPUT_ON_FAILURE=1 \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -allow-empty \ ; RUN: -check-prefixes=NOTRACE,NODUMP +; FileCheck fail, -v => dump, no trace. ; RUN: %ProtectFileCheckOutput FILECHECK_DUMP_INPUT_ON_FAILURE=1 \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -v 2>&1 \ @@ -149,23 +162,105 @@ ; Check -dump-input=always. ;-------------------------------------------------- +; FileCheck success, -v => dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=always -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,DUMP-OK +; FileCheck fail, -v => dump, no trace. ; RUN: %ProtectFileCheckOutput \ ; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ ; RUN: -match-full-lines -dump-input=always -v 2>&1 \ ; RUN: | FileCheck %s -match-full-lines \ ; RUN: -check-prefixes=NOTRACE,ERR,DUMP-ERR,DUMP-ERR-V +;-------------------------------------------------- +; Check multiple -dump-input options. +; +; This ocurrs most commonly when a test author specifies -dump-input on a +; specific FileCheck call while a test runner specifies -dump-input in +; FILECHECK_OPTS, but check the behavior generally. +; +; "help" has precedence, and then the most verbose value wins. The most +; common combinations involve "fail" and "always", so test those the most. +;-------------------------------------------------- + +;- - - - - - - - - - - - - - - - - - - - - - - - - +; Check duplicate. +;- - - - - - - - - - - - - - - - - - - - - - - - - + +; fail, fail => fail (FileCheck fail => dump) +; RUN: %ProtectFileCheckOutput \ +; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ +; RUN: -match-full-lines -dump-input=fail -dump-input=fail -v \ +; RUN: 2>&1 \ +; RUN: | FileCheck %s -match-full-lines \ +; RUN: -check-prefixes=NOTRACE,ERR,DUMP-ERR,DUMP-ERR-V + +;- - - - - - - - - - - - - - - - - - - - - - - - - +; Check precedence. +;- - - - - - - - - - - - - - - - - - - - - - - - - + +; help, always => help +; RUN: %ProtectFileCheckOutput \ +; RUN: FileCheck -input-file %t.err -color %t.check \ +; RUN: -dump-input=help -dump-input=always \ +; RUN: | FileCheck %s -check-prefix=HELP + +; always, fail => always (FileCheck success => dump) +; RUN: %ProtectFileCheckOutput \ +; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ +; RUN: -match-full-lines -dump-input=always -dump-input=fail \ +; RUN: -v 2>&1 \ +; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,DUMP-OK + +; fail, never => fail (FileCheck fail => dump) +; RUN: %ProtectFileCheckOutput \ +; RUN: not FileCheck -input-file %t.err %t.check -check-prefix=CHECK \ +; RUN: -match-full-lines -dump-input=fail -dump-input=never -v \ +; RUN: 2>&1 \ +; RUN: | FileCheck %s -match-full-lines \ +; RUN: -check-prefixes=NOTRACE,ERR,DUMP-ERR,DUMP-ERR-V + +;- - - - - - - - - - - - - - - - - - - - - - - - - +; Check that order doesn't matter. +;- - - - - - - - - - - - - - - - - - - - - - - - - + +; fail, always => always (FileCheck success => dump) +; RUN: %ProtectFileCheckOutput \ +; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ +; RUN: -match-full-lines -dump-input=fail -dump-input=always \ +; RUN: -v 2>&1 \ +; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,DUMP-OK + +;- - - - - - - - - - - - - - - - - - - - - - - - - +; Check that FILECHECK_OPTS isn't handled differently. +;- - - - - - - - - - - - - - - - - - - - - - - - - + +; always, fail => always (FileCheck success => dump) +; RUN: %ProtectFileCheckOutput FILECHECK_OPTS=-dump-input=always \ +; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ +; RUN: -match-full-lines -dump-input=fail -v 2>&1 \ +; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,DUMP-OK + +; fail, always => always (FileCheck success => dump) +; RUN: %ProtectFileCheckOutput FILECHECK_OPTS=-dump-input=fail \ +; RUN: FileCheck -input-file %t.good %t.check -check-prefix=CHECK \ +; RUN: -match-full-lines -dump-input=always -v 2>&1 \ +; RUN: | FileCheck %s -match-full-lines -check-prefixes=NOTRACE,DUMP-OK + ; END. ;-------------------------------------------------- -; Check the output for all cases that actually process directives. +; Check the output. ;-------------------------------------------------- +; HELP-NOT: {{.}} +; HELP: The following description was requested by -dump-input=help +; HELP: try{{.*}}-color +; HELP-NOT: {{.}} + ; Trace is sometimes suppressed. ; TRACE: {{.*}}remark:{{.*}} ; NOTRACE-NOT: remark: diff --git a/llvm/utils/FileCheck/FileCheck.cpp b/llvm/utils/FileCheck/FileCheck.cpp --- a/llvm/utils/FileCheck/FileCheck.cpp +++ b/llvm/utils/FileCheck/FileCheck.cpp @@ -108,24 +108,28 @@ "FILECHECK_DUMP_INPUT_ON_FAILURE environment variable.\n" "This option is deprecated in favor of -dump-input=fail.\n")); +// The order of DumpInputValue members affects their precedence, as documented +// for -dump-input below. enum DumpInputValue { DumpInputDefault, - DumpInputHelp, DumpInputNever, DumpInputFail, - DumpInputAlways + DumpInputAlways, + DumpInputHelp }; -static cl::opt DumpInput( - "dump-input", cl::init(DumpInputDefault), +static cl::list DumpInputs( + "dump-input", cl::desc("Dump input to stderr, adding annotations representing\n" - " currently enabled diagnostics\n"), + "currently enabled diagnostics. When there are multiple\n" + "occurrences of this option, the that appears earliest\n" + "in the list below has precedence.\n"), cl::value_desc("mode"), cl::values(clEnumValN(DumpInputHelp, "help", "Explain dump format and quit"), - clEnumValN(DumpInputNever, "never", "Never dump input"), + clEnumValN(DumpInputAlways, "always", "Always dump input"), clEnumValN(DumpInputFail, "fail", "Dump input on failure"), - clEnumValN(DumpInputAlways, "always", "Always dump input"))); + clEnumValN(DumpInputNever, "never", "Never dump input"))); typedef cl::list::const_iterator prefix_iterator; @@ -516,6 +520,10 @@ InitLLVM X(argc, argv); cl::ParseCommandLineOptions(argc, argv, /*Overview*/ "", /*Errs*/ nullptr, "FILECHECK_OPTS"); + DumpInputValue DumpInput = + DumpInputs.empty() + ? DumpInputDefault + : *std::max_element(DumpInputs.begin(), DumpInputs.end()); if (DumpInput == DumpInputHelp) { DumpInputAnnotationHelp(outs()); return 0;