diff --git a/.gitignore b/.gitignore index 57869d6..8273543 100644 --- a/.gitignore +++ b/.gitignore @@ -31,6 +31,8 @@ stdout.txt # script-generated expected with absolute file paths tests/tc_locate_ufcs_function/expected.txt tests/tc_recursive_public_import/expected.txt +# other script-generated files +tests/extra/tc_ufcs_all_kinds/generate_tests # Dub files .dub diff --git a/tests/extra/tc_ufcs_all_kinds/generate_tests.d b/tests/extra/tc_ufcs_all_kinds/generate_tests.d index 637b241..e8a517a 100644 --- a/tests/extra/tc_ufcs_all_kinds/generate_tests.d +++ b/tests/extra/tc_ufcs_all_kinds/generate_tests.d @@ -129,29 +129,27 @@ int main(string[] args) fs.write("proc_test.d", code); - auto output = executeShell("$DC -verrors=0 -c proc_test.d").output; + auto output = executeShell("$DC -verrors=0 $ERROR_STYLE -c proc_test.d").output; size_t numErrors = 0; string[][string] variableIncompatibilities; + // Example of a line we want to match: `proc_test.d:2568:22: error: [...]' + auto errRegex = regex(`proc_test\.d:([0-9]*):[0-9]*: error`, "i"); foreach (err; output.lineSplitter) { - if (!err.startsWith("proc_test.d(")) - continue; - err = err["proc_test.d(".length .. $]; - auto lineNo = err.parse!int; - if (!err.startsWith("): Error: ")) - continue; - err = err["): Error: ".length .. $]; - string line = lines[lineNo - 1]; - enforce(line.endsWith("();"), "Unexpected error in line " ~ lineNo.to!string); - line = line[0 .. $ - 3]; - string varName = line.findSplit(".")[0]; - string funcName = line.findSplit(".")[2]; - // writeln("variable type ", varLookup[varName], " can't call ", funcLookup[funcName]); - variableIncompatibilities[varName] ~= funcName; - numErrors++; + if (auto m = matchFirst(err, errRegex)) { + auto lineNo = to!int(m[1]); + string line = lines[lineNo - 1]; + enforce(line.endsWith("();"), "Unexpected error in line " ~ lineNo.to!string); + line = line[0 .. $ - 3]; + string varName = line.findSplit(".")[0]; + string funcName = line.findSplit(".")[2]; + // writeln("variable type ", varLookup[varName], " can't call ", funcLookup[funcName]); + variableIncompatibilities[varName] ~= funcName; + numErrors++; + } } enforce(numErrors > 1_000, "compiler didn't error as expected, need to adjust tests!"); diff --git a/tests/extra/tc_ufcs_all_kinds/run.sh b/tests/extra/tc_ufcs_all_kinds/run.sh index 2c5e79c..6f3bb9e 100755 --- a/tests/extra/tc_ufcs_all_kinds/run.sh +++ b/tests/extra/tc_ufcs_all_kinds/run.sh @@ -4,4 +4,19 @@ if [ -z "${DC:-}" ]; then DC=dmd fi -DC="$DC" "$DC" -run generate_tests.d "$1" +DCBASE=$(basename "${DC}") + +# Set up ERROR_STYLE to make all compilers output errors in the same +# format to make matching easier in generate_tests.d. + +if [[ ${DCBASE} =~ gdmd ]]; then + ERROR_STYLE= +elif [[ ${DCBASE} =~ dmd|ldc ]]; then + ERROR_STYLE='-verror-style=gnu -vcolumns' +else + echo "unknonwn compiler ${DC}" + exit 1 +fi + +export DC ERROR_STYLE +${DC} -run generate_tests.d "${1}"