From 79684a0bed2d33c2379a4a9e4efa7158b59ca17b Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Tue, 8 Nov 2011 17:19:26 -0800 Subject: [PATCH] Add support for running tests that are expected to fail Also add should-fail tests that exercise const and decl initializers --- ispc.cpp | 1 + ispc.h | 4 ++++ main.cpp | 2 ++ run_tests.py | 28 ++++++++++++++++++++++++++++ tests_errors/const-1.ispc | 6 ++++++ tests_errors/const-2.ispc | 6 ++++++ tests_errors/const-3.ispc | 9 +++++++++ tests_errors/const-4.ispc | 9 +++++++++ tests_errors/const-5.ispc | 6 ++++++ tests_errors/decl-1.ispc | 5 +++++ tests_errors/decl-2.ispc | 5 +++++ tests_errors/decl-3.ispc | 5 +++++ tests_errors/decl-4.ispc | 5 +++++ util.cpp | 3 +++ 14 files changed, 94 insertions(+) create mode 100644 tests_errors/const-1.ispc create mode 100644 tests_errors/const-2.ispc create mode 100644 tests_errors/const-3.ispc create mode 100644 tests_errors/const-4.ispc create mode 100644 tests_errors/const-5.ispc create mode 100644 tests_errors/decl-1.ispc create mode 100644 tests_errors/decl-2.ispc create mode 100644 tests_errors/decl-3.ispc create mode 100644 tests_errors/decl-4.ispc diff --git a/ispc.cpp b/ispc.cpp index e62749e3..e81cc7ad 100644 --- a/ispc.cpp +++ b/ispc.cpp @@ -332,6 +332,7 @@ Globals::Globals() { runCPP = true; debugPrint = false; disableWarnings = false; + disableLineWrap = false; emitPerfWarnings = true; emitInstrumentation = false; generateDebuggingSymbols = false; diff --git a/ispc.h b/ispc.h index 26f209c1..3de5a78f 100644 --- a/ispc.h +++ b/ispc.h @@ -337,6 +337,10 @@ struct Globals { /** Indicates whether all warning messages should be surpressed. */ bool disableWarnings; + /** Indicates whether line wrapping of error messages to the terminal + width should be disabled. */ + bool disableLineWrap; + /** Indicates whether additional warnings should be issued about possible performance pitfalls. */ bool emitPerfWarnings; diff --git a/main.cpp b/main.cpp index 9af8a6d9..11d54213 100644 --- a/main.cpp +++ b/main.cpp @@ -280,6 +280,8 @@ int main(int Argc, char *Argv[]) { g->disableWarnings = true; g->emitPerfWarnings = false; } + else if (!strcmp(argv[i], "--nowrap")) + g->disableLineWrap = true; else if (!strcmp(argv[i], "--wno-perf") || !strcmp(argv[i], "-wno-perf")) g->emitPerfWarnings = false; else if (!strcmp(argv[i], "-o")) { diff --git a/run_tests.py b/run_tests.py index 8a1c43bb..9a6b7283 100755 --- a/run_tests.py +++ b/run_tests.py @@ -17,6 +17,7 @@ import random import string import mutex import subprocess +import shlex import platform parser = OptionParser() @@ -102,6 +103,33 @@ def run_tasks_from_queue(queue): if (filename == 'STOP'): sys.exit(error_count) + # is this a test to make sure an error is issued? + want_error = (filename.find("tests_errors") != -1) + if want_error == True: + ispc_cmd = "ispc --nowrap --woff %s --arch=%s --target=%s" % \ + ( filename, options.arch, options.target) + sp = subprocess.Popen(shlex.split(ispc_cmd), stdin=None, stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + output = sp.communicate()[1] + got_error = (sp.returncode != 0) + + # figure out the error message we're expecting + file = open(filename, 'r') + firstline = file.readline() + firstline = string.replace(firstline, "//", "") + firstline = string.lstrip(firstline) + firstline = string.rstrip(firstline) + file.close() + + if (output.find(firstline) == -1): + print "Didn't see expected error message \"%s\" from test %s.\nActual outout: %s" % \ + (firstline, filename, output) + error_count += 1 + elif got_error == False: + print "Unexpectedly no errors issued from test %s" % filename + error_count += 1 + continue + # do we expect this test to fail? should_fail = (filename.find("failing_") != -1) diff --git a/tests_errors/const-1.ispc b/tests_errors/const-1.ispc new file mode 100644 index 00000000..20b5bb8d --- /dev/null +++ b/tests_errors/const-1.ispc @@ -0,0 +1,6 @@ +// Can't pre-increment + +int func() { + const int x = 2; + ++x; +} diff --git a/tests_errors/const-2.ispc b/tests_errors/const-2.ispc new file mode 100644 index 00000000..db2d6734 --- /dev/null +++ b/tests_errors/const-2.ispc @@ -0,0 +1,6 @@ +// Can't assign to type + +int func() { + const int x = 2; + x = 0; +} diff --git a/tests_errors/const-3.ispc b/tests_errors/const-3.ispc new file mode 100644 index 00000000..1cde38f4 --- /dev/null +++ b/tests_errors/const-3.ispc @@ -0,0 +1,9 @@ +// Can't assign to type + +struct Foo { + int x; +}; + +int func(const Foo f) { + f.x = 0; +} diff --git a/tests_errors/const-4.ispc b/tests_errors/const-4.ispc new file mode 100644 index 00000000..969d8bfc --- /dev/null +++ b/tests_errors/const-4.ispc @@ -0,0 +1,9 @@ +// Can't assign to type + +struct Foo { + int x; +}; + +int func(const int f) { + f -= 2; +} diff --git a/tests_errors/const-5.ispc b/tests_errors/const-5.ispc new file mode 100644 index 00000000..1f2a4da4 --- /dev/null +++ b/tests_errors/const-5.ispc @@ -0,0 +1,6 @@ +// Can't assign to type + +int func() { + const int a[10] = {1,2,3,4,5,6,7,8,9,10}; + a[0] = 1; +} diff --git a/tests_errors/decl-1.ispc b/tests_errors/decl-1.ispc new file mode 100644 index 00000000..71e773c1 --- /dev/null +++ b/tests_errors/decl-1.ispc @@ -0,0 +1,5 @@ +// requires 10 values; 11 provided + +int func() { + int a[10] = {1,2,3,4,5,6,7,8,9,10,11}; +} diff --git a/tests_errors/decl-2.ispc b/tests_errors/decl-2.ispc new file mode 100644 index 00000000..23ef497b --- /dev/null +++ b/tests_errors/decl-2.ispc @@ -0,0 +1,5 @@ +// requires 12 values; 11 provided + +int func() { + int a[12] = {1,2,3,4,5,6,7,8,9,10,11}; +} diff --git a/tests_errors/decl-3.ispc b/tests_errors/decl-3.ispc new file mode 100644 index 00000000..451ced22 --- /dev/null +++ b/tests_errors/decl-3.ispc @@ -0,0 +1,5 @@ +// Expression list initializers can't be used + +int func() { + int a = { 1 }; +} diff --git a/tests_errors/decl-4.ispc b/tests_errors/decl-4.ispc new file mode 100644 index 00000000..fe758a61 --- /dev/null +++ b/tests_errors/decl-4.ispc @@ -0,0 +1,5 @@ +// Can't declare an unsized array as a local variable without providing an initializer expression to set its size + +int func() { + int a[]; +} diff --git a/util.cpp b/util.cpp index 7cc1ce72..78e94020 100644 --- a/util.cpp +++ b/util.cpp @@ -69,6 +69,9 @@ */ static int lTerminalWidth() { + if (g->disableLineWrap) + return 1<<30; + #if defined(ISPC_IS_WINDOWS) HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); if (h == INVALID_HANDLE_VALUE || h == NULL)