summaryrefslogtreecommitdiffstats
path: root/tests/diagnostics
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-06-09 11:34:21 -0700
committerTim Foley <tfoley@nvidia.com>2017-06-09 13:44:59 -0700
commitfcf83dbf9effab3bd98bad2b83b2468b7eb05cfd (patch)
tree41047c94883b86ec085a81597391ce3ef557cd43 /tests/diagnostics
parent52e8d4b9a27ab0060f874c3a63ab531847be35c0 (diff)
Initial import of code.
Diffstat (limited to 'tests/diagnostics')
-rw-r--r--tests/diagnostics/break-outside-loop.spire4
-rw-r--r--tests/diagnostics/break-outside-loop.spire.expected6
-rw-r--r--tests/diagnostics/call-argument-type.spire11
-rw-r--r--tests/diagnostics/call-argument-type.spire.expected6
-rw-r--r--tests/diagnostics/continue-outside-loop.spire4
-rw-r--r--tests/diagnostics/continue-outside-loop.spire.expected6
-rw-r--r--tests/diagnostics/expected-token-eof.spire6
-rw-r--r--tests/diagnostics/expected-token-eof.spire.expected6
-rw-r--r--tests/diagnostics/expected-token.spire7
-rw-r--r--tests/diagnostics/expected-token.spire.expected6
-rw-r--r--tests/diagnostics/function-redefinition.spire.disabled5
-rw-r--r--tests/diagnostics/function-redefinition.spire.expected6
-rw-r--r--tests/diagnostics/hull-shader-invalid-domain.spire.disabled53
-rw-r--r--tests/diagnostics/hull-shader-invalid-domain.spire.expected6
-rw-r--r--tests/diagnostics/hull-shader-no-domain.spire.disabled53
-rw-r--r--tests/diagnostics/hull-shader-no-domain.spire.expected6
-rw-r--r--tests/diagnostics/illegal-character.spire5
-rw-r--r--tests/diagnostics/illegal-character.spire.expected6
-rw-r--r--tests/diagnostics/missing-file.spire.disabled3
-rw-r--r--tests/diagnostics/missing-file.spire.expected7
-rw-r--r--tests/diagnostics/missing-include-file.spire4
-rw-r--r--tests/diagnostics/missing-include-file.spire.expected6
-rw-r--r--tests/diagnostics/parameter-already-defined.spire4
-rw-r--r--tests/diagnostics/parameter-already-defined.spire.expected6
-rw-r--r--tests/diagnostics/undefined-identifier.spire7
-rw-r--r--tests/diagnostics/undefined-identifier.spire.expected6
-rw-r--r--tests/diagnostics/variable-void-type.spire7
-rw-r--r--tests/diagnostics/variable-void-type.spire.expected6
-rw-r--r--tests/diagnostics/while-predicate-type.spire10
-rw-r--r--tests/diagnostics/while-predicate-type.spire.expected6
30 files changed, 274 insertions, 0 deletions
diff --git a/tests/diagnostics/break-outside-loop.spire b/tests/diagnostics/break-outside-loop.spire
new file mode 100644
index 000000000..f86b0bad6
--- /dev/null
+++ b/tests/diagnostics/break-outside-loop.spire
@@ -0,0 +1,4 @@
+//TEST:SIMPLE:
+// `break` where it isn't allowed
+
+void foo() { break; }
diff --git a/tests/diagnostics/break-outside-loop.spire.expected b/tests/diagnostics/break-outside-loop.spire.expected
new file mode 100644
index 000000000..2d56efaa9
--- /dev/null
+++ b/tests/diagnostics/break-outside-loop.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/break-outside-loop.spire(4): error 30003: 'break' must appear inside loop constructs.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/call-argument-type.spire b/tests/diagnostics/call-argument-type.spire
new file mode 100644
index 000000000..d9663147f
--- /dev/null
+++ b/tests/diagnostics/call-argument-type.spire
@@ -0,0 +1,11 @@
+//TEST:SIMPLE:
+// call function with wrong argument type
+
+struct A {};
+struct B {};
+
+void f(A a) {}
+void g(B b)
+{
+ f(b);
+}
diff --git a/tests/diagnostics/call-argument-type.spire.expected b/tests/diagnostics/call-argument-type.spire.expected
new file mode 100644
index 000000000..09a01a359
--- /dev/null
+++ b/tests/diagnostics/call-argument-type.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/call-argument-type.spire(10): error 30019: expected an expression of type 'A', got 'B'
+}
+standard output = {
+}
diff --git a/tests/diagnostics/continue-outside-loop.spire b/tests/diagnostics/continue-outside-loop.spire
new file mode 100644
index 000000000..cad9dce6e
--- /dev/null
+++ b/tests/diagnostics/continue-outside-loop.spire
@@ -0,0 +1,4 @@
+//TEST:SIMPLE:
+// `continue` where it isn't allowed
+
+void foo() { continue; }
diff --git a/tests/diagnostics/continue-outside-loop.spire.expected b/tests/diagnostics/continue-outside-loop.spire.expected
new file mode 100644
index 000000000..d12cceb78
--- /dev/null
+++ b/tests/diagnostics/continue-outside-loop.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/continue-outside-loop.spire(4): error 30004: 'continue' must appear inside loop constructs.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/expected-token-eof.spire b/tests/diagnostics/expected-token-eof.spire
new file mode 100644
index 000000000..99ab161ec
--- /dev/null
+++ b/tests/diagnostics/expected-token-eof.spire
@@ -0,0 +1,6 @@
+//TEST:SIMPLE:
+// expected one token, but got EOF
+
+int foo()
+{
+ int a = 3 \ No newline at end of file
diff --git a/tests/diagnostics/expected-token-eof.spire.expected b/tests/diagnostics/expected-token-eof.spire.expected
new file mode 100644
index 000000000..121ac3374
--- /dev/null
+++ b/tests/diagnostics/expected-token-eof.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/expected-token-eof.spire(6): error 20001: unexpected end of file, expected ';'
+}
+standard output = {
+}
diff --git a/tests/diagnostics/expected-token.spire b/tests/diagnostics/expected-token.spire
new file mode 100644
index 000000000..db85e7b92
--- /dev/null
+++ b/tests/diagnostics/expected-token.spire
@@ -0,0 +1,7 @@
+//TEST:SIMPLE:
+// expected one token, but got another
+
+int foo()
+{
+ int a = 3 ]
+} \ No newline at end of file
diff --git a/tests/diagnostics/expected-token.spire.expected b/tests/diagnostics/expected-token.spire.expected
new file mode 100644
index 000000000..508a06726
--- /dev/null
+++ b/tests/diagnostics/expected-token.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/expected-token.spire(6): error 20001: unexpected ']', expected ';'
+}
+standard output = {
+}
diff --git a/tests/diagnostics/function-redefinition.spire.disabled b/tests/diagnostics/function-redefinition.spire.disabled
new file mode 100644
index 000000000..d47cb1bbc
--- /dev/null
+++ b/tests/diagnostics/function-redefinition.spire.disabled
@@ -0,0 +1,5 @@
+//TEST:SIMPLE:
+// redefining a function
+
+int foo(int a) { return 0; }
+int foo(int b) { return 1; }
diff --git a/tests/diagnostics/function-redefinition.spire.expected b/tests/diagnostics/function-redefinition.spire.expected
new file mode 100644
index 000000000..94b0d3626
--- /dev/null
+++ b/tests/diagnostics/function-redefinition.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/function-redefinition.spire(5): error 30001: 'foo(int)': function redefinition.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/hull-shader-invalid-domain.spire.disabled b/tests/diagnostics/hull-shader-invalid-domain.spire.disabled
new file mode 100644
index 000000000..a1341631a
--- /dev/null
+++ b/tests/diagnostics/hull-shader-invalid-domain.spire.disabled
@@ -0,0 +1,53 @@
+//TEST:SIMPLE:
+// `HullShader` without `Domain` attribute
+
+pipeline P
+{
+ world CoarseVertex;
+ world ControlPoint;
+ world CornerPoint;
+ world TessPatch;
+ world FineVertex;
+
+ require @FineVertex vec4 RS_Position;
+ require @ControlPoint vec2 tessLevelInner;
+ require @ControlPoint vec4 tessLevelOuter;
+
+ // implicit import operator CoarseVertex->CornerPoint
+ extern @CornerPoint CoarseVertex[] CoarseVertex_ControlPoint;
+ [PerCornerIterator]
+ extern @CornerPoint int HS_CornerID;
+
+ extern @ControlPoint CoarseVertex[] CoarseVertex_ControlPoint;
+ extern @TessPatch CoarseVertex[] CoarseVertex_ControlPoint;
+ [InvocationId]
+ extern @ControlPoint int invocationId;
+ extern @FineVertex ControlPoint[] ControlPoint_tes;
+ extern @FineVertex Patch<TessPatch> perPatch_tes;
+
+ extern @FineVertex Patch<CornerPoint[3]> perCorner_tes;
+ [TessCoord]
+ extern @FineVertex vec3 tessCoord;
+
+ stage hs : HullShader
+ {
+ PatchWorld: TessPatch;
+ ControlPointWorld: ControlPoint;
+ CornerPointWorld: CornerPoint;
+ InputControlPointCount: 3;
+ ControlPointCount: 1;
+ Domain: pentagons;
+ TessLevelOuter: tessLevelOuter;
+ TessLevelInner: tessLevelInner;
+ Partitioning: integer;
+ OutputTopology: triangle_ccw;
+ }
+}
+
+shader S
+ targets P
+{
+ @FineVertex float4 RS_Position = float4(0.0);
+ @ControlPoint float2 tessLevelInner = float2(2.0);
+ @ControlPoint float4 tessLevelOuter = float4(2.0);
+} \ No newline at end of file
diff --git a/tests/diagnostics/hull-shader-invalid-domain.spire.expected b/tests/diagnostics/hull-shader-invalid-domain.spire.expected
new file mode 100644
index 000000000..89b4634aa
--- /dev/null
+++ b/tests/diagnostics/hull-shader-invalid-domain.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/hull-shader-invalid-domain.spire(39): error 50053: 'Domain' should be either 'triangles' or 'quads'.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/hull-shader-no-domain.spire.disabled b/tests/diagnostics/hull-shader-no-domain.spire.disabled
new file mode 100644
index 000000000..87bf2a81c
--- /dev/null
+++ b/tests/diagnostics/hull-shader-no-domain.spire.disabled
@@ -0,0 +1,53 @@
+//TEST:SIMPLE:
+// `HullShader` without `Domain` attribute
+
+pipeline P
+{
+ world CoarseVertex;
+ world ControlPoint;
+ world CornerPoint;
+ world TessPatch;
+ world FineVertex;
+
+ require @FineVertex vec4 RS_Position;
+ require @ControlPoint vec2 tessLevelInner;
+ require @ControlPoint vec4 tessLevelOuter;
+
+ // implicit import operator CoarseVertex->CornerPoint
+ extern @CornerPoint CoarseVertex[] CoarseVertex_ControlPoint;
+ [PerCornerIterator]
+ extern @CornerPoint int HS_CornerID;
+
+ extern @ControlPoint CoarseVertex[] CoarseVertex_ControlPoint;
+ extern @TessPatch CoarseVertex[] CoarseVertex_ControlPoint;
+ [InvocationId]
+ extern @ControlPoint int invocationId;
+ extern @FineVertex ControlPoint[] ControlPoint_tes;
+ extern @FineVertex Patch<TessPatch> perPatch_tes;
+
+ extern @FineVertex Patch<CornerPoint[3]> perCorner_tes;
+ [TessCoord]
+ extern @FineVertex vec3 tessCoord;
+
+ stage hs : HullShader
+ {
+ PatchWorld: TessPatch;
+ ControlPointWorld: ControlPoint;
+ CornerPointWorld: CornerPoint;
+ InputControlPointCount: 3;
+ ControlPointCount: 1;
+// Domain: triangles;
+ TessLevelOuter: tessLevelOuter;
+ TessLevelInner: tessLevelInner;
+ Partitioning: integer;
+ OutputTopology: triangle_ccw;
+ }
+}
+
+shader S
+ targets P
+{
+ @FineVertex float4 RS_Position = float4(0.0);
+ @ControlPoint float2 tessLevelInner = float2(2.0);
+ @ControlPoint float4 tessLevelOuter = float4(2.0);
+} \ No newline at end of file
diff --git a/tests/diagnostics/hull-shader-no-domain.spire.expected b/tests/diagnostics/hull-shader-no-domain.spire.expected
new file mode 100644
index 000000000..08a08ad79
--- /dev/null
+++ b/tests/diagnostics/hull-shader-no-domain.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/hull-shader-no-domain.spire(32): error 50052: 'HullShader' requires attribute 'Domain'.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/illegal-character.spire b/tests/diagnostics/illegal-character.spire
new file mode 100644
index 000000000..5915e861f
--- /dev/null
+++ b/tests/diagnostics/illegal-character.spire
@@ -0,0 +1,5 @@
+//TEST:SIMPLE:
+// illegal character
+
+`
+
diff --git a/tests/diagnostics/illegal-character.spire.expected b/tests/diagnostics/illegal-character.spire.expected
new file mode 100644
index 000000000..301b99063
--- /dev/null
+++ b/tests/diagnostics/illegal-character.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/illegal-character.spire(4): error 10000: illegal character '`'
+}
+standard output = {
+}
diff --git a/tests/diagnostics/missing-file.spire.disabled b/tests/diagnostics/missing-file.spire.disabled
new file mode 100644
index 000000000..f340dd95e
--- /dev/null
+++ b/tests/diagnostics/missing-file.spire.disabled
@@ -0,0 +1,3 @@
+// trying to import a non-existant file
+
+using "does-not-exist.spire"
diff --git a/tests/diagnostics/missing-file.spire.expected b/tests/diagnostics/missing-file.spire.expected
new file mode 100644
index 000000000..d4722c0e2
--- /dev/null
+++ b/tests/diagnostics/missing-file.spire.expected
@@ -0,0 +1,7 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/missing-file.spire(1): error 20001: unexpected end of file, expected ';'
+Tests/Diagnostics/missing-file.spire(4): error 2: cannot find file 'does-not-exist.spire'.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/missing-include-file.spire b/tests/diagnostics/missing-include-file.spire
new file mode 100644
index 000000000..9e0f99b9c
--- /dev/null
+++ b/tests/diagnostics/missing-include-file.spire
@@ -0,0 +1,4 @@
+//TEST:SIMPLE:
+// trying to include a non-existant file
+
+#include "does-not-exist.h"
diff --git a/tests/diagnostics/missing-include-file.spire.expected b/tests/diagnostics/missing-include-file.spire.expected
new file mode 100644
index 000000000..24649c484
--- /dev/null
+++ b/tests/diagnostics/missing-include-file.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/missing-include-file.spire(4): error 15300: failed to find include file 'does-not-exist.h'
+}
+standard output = {
+}
diff --git a/tests/diagnostics/parameter-already-defined.spire b/tests/diagnostics/parameter-already-defined.spire
new file mode 100644
index 000000000..860b17e65
--- /dev/null
+++ b/tests/diagnostics/parameter-already-defined.spire
@@ -0,0 +1,4 @@
+//TEST:SIMPLE:
+// re-use parameter name
+
+int foo( int a, float a ) { return 0; }
diff --git a/tests/diagnostics/parameter-already-defined.spire.expected b/tests/diagnostics/parameter-already-defined.spire.expected
new file mode 100644
index 000000000..0021afa42
--- /dev/null
+++ b/tests/diagnostics/parameter-already-defined.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/parameter-already-defined.spire(4): error 30002: parameter 'a' already defined.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/undefined-identifier.spire b/tests/diagnostics/undefined-identifier.spire
new file mode 100644
index 000000000..6c5a59f75
--- /dev/null
+++ b/tests/diagnostics/undefined-identifier.spire
@@ -0,0 +1,7 @@
+//TEST:SIMPLE:
+// use of undefined identifier
+
+void foo()
+{
+ int a = b;
+}
diff --git a/tests/diagnostics/undefined-identifier.spire.expected b/tests/diagnostics/undefined-identifier.spire.expected
new file mode 100644
index 000000000..2eed77baf
--- /dev/null
+++ b/tests/diagnostics/undefined-identifier.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/undefined-identifier.spire(6): error 30015: undefined identifier 'b'.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/variable-void-type.spire b/tests/diagnostics/variable-void-type.spire
new file mode 100644
index 000000000..926e6401d
--- /dev/null
+++ b/tests/diagnostics/variable-void-type.spire
@@ -0,0 +1,7 @@
+//TEST:SIMPLE:
+// variable with `void` type
+
+void foo()
+{
+ void a;
+}
diff --git a/tests/diagnostics/variable-void-type.spire.expected b/tests/diagnostics/variable-void-type.spire.expected
new file mode 100644
index 000000000..1f0e6765c
--- /dev/null
+++ b/tests/diagnostics/variable-void-type.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/variable-void-type.spire(6): error 30009: invalid type 'void'.
+}
+standard output = {
+}
diff --git a/tests/diagnostics/while-predicate-type.spire b/tests/diagnostics/while-predicate-type.spire
new file mode 100644
index 000000000..14ce45533
--- /dev/null
+++ b/tests/diagnostics/while-predicate-type.spire
@@ -0,0 +1,10 @@
+//TEST:SIMPLE:
+// bad type for `while` predicate
+
+struct S {};
+
+void foo()
+{
+ S s;
+ while(s) {break;}
+}
diff --git a/tests/diagnostics/while-predicate-type.spire.expected b/tests/diagnostics/while-predicate-type.spire.expected
new file mode 100644
index 000000000..9f94e679e
--- /dev/null
+++ b/tests/diagnostics/while-predicate-type.spire.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+Tests/Diagnostics/while-predicate-type.spire(9): error 30010: 'while': expression must evaluate to int.
+}
+standard output = {
+}