summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Foley <tfoleyNV@users.noreply.github.com>2018-02-26 14:02:29 -0800
committerGitHub <noreply@github.com>2018-02-26 14:02:29 -0800
commitc3bc49624891d9799975ae4a47e598961eea8aab (patch)
tree78a2f1d4974e6ef5fabab8d15c18946d7738303d
parent28887ae858450e8a5efc8d43851fd8e5b5356e32 (diff)
Merge from 0.9.x (#429)
* Fix bug when subscripting a type that must be split (#396) The logic was creating a `PairPseudoExpr` as part of a subscript (`operator[]`) operation, but neglecting to fill in its `pairInfo` field, which led to a null-pointer crash further along. * Allow writes to UAV textures (#416) Work on #415 This issue is already fixed in the `v0.10.*` line, but I'm back-porting the fix to `v0.9.*`. The issue here was that the stdlib declarations for texture types were only including the `get` accessor for subscript operations, even if the texture was write-able. I've also included the fixes for other subscript accessors in the stdlib (notably that `OutputPatch<T>` is readable, but not writable, despite what the name seems to imply). * Fix infinite loop in semantic parsing (#424) The code for parsing semantics was looking for a fixed set of tokens to terminate a semantic list, rather than assuming that whenever you don't see a `:` ahead, you probably are done with semantics. This meant that you could get into an infinite loop just with simple mistakes like leaving out a `;`. This change fixes the parser to note infinite loop in this case, and adds a test case to verify the fix.
-rw-r--r--source/slang/parser.cpp36
-rw-r--r--tests/diagnostics/missing-semicolon-after-semantic.slang9
-rw-r--r--tests/diagnostics/missing-semicolon-after-semantic.slang.expected6
-rw-r--r--tests/front-end/uav-write.slang20
4 files changed, 59 insertions, 12 deletions
diff --git a/source/slang/parser.cpp b/source/slang/parser.cpp
index 037268244..82f79af17 100644
--- a/source/slang/parser.cpp
+++ b/source/slang/parser.cpp
@@ -1863,12 +1863,18 @@ namespace Slang
ParseHLSLLayoutSemantic(parser, semantic.Ptr());
return semantic;
}
- else
+ else if (parser->LookAheadToken(TokenType::Identifier))
{
RefPtr<HLSLSimpleSemantic> semantic = new HLSLSimpleSemantic();
semantic->name = parser->ReadToken(TokenType::Identifier);
return semantic;
}
+ else
+ {
+ // expect an identifier, just to produce an error message
+ parser->ReadToken(TokenType::Identifier);
+ return nullptr;
+ }
}
//
@@ -1893,20 +1899,26 @@ namespace Slang
link = &semantic->next;
}
- switch (parser->tokenReader.PeekTokenType())
+ // If we see another `:`, then that means there
+ // is yet another semantic to be processed.
+ // Otherwise we assume we are at the end of the list.
+ //
+ // TODO: This could produce sub-optimal diagnostics
+ // when the user *meant* to apply multiple semantics
+ // to a single declaration:
+ //
+ // Foo foo : register(t0) register(s0);
+ // ^
+ // missing ':' here |
+ //
+ // However, that is an uncommon occurence, and trying
+ // to continue parsing semantics here even if we didn't
+ // see a colon forces us to be careful about
+ // avoiding an infinite loop here.
+ if (!AdvanceIf(parser, TokenType::Colon))
{
- case TokenType::LBrace:
- case TokenType::Semicolon:
- case TokenType::Comma:
- case TokenType::RParent:
- case TokenType::EndOfFile:
return result;
-
- default:
- break;
}
-
- parser->ReadToken(TokenType::Colon);
}
}
diff --git a/tests/diagnostics/missing-semicolon-after-semantic.slang b/tests/diagnostics/missing-semicolon-after-semantic.slang
new file mode 100644
index 000000000..00fc3aa6c
--- /dev/null
+++ b/tests/diagnostics/missing-semicolon-after-semantic.slang
@@ -0,0 +1,9 @@
+//TEST:SIMPLE:
+
+// Forgetting to put in the `;` after declaraing a variable/field
+// with a semantic used to put the compiler into an infinite loop.
+
+struct Test
+{
+ float4 pos : SV_POSITION
+};
diff --git a/tests/diagnostics/missing-semicolon-after-semantic.slang.expected b/tests/diagnostics/missing-semicolon-after-semantic.slang.expected
new file mode 100644
index 000000000..ae82385d0
--- /dev/null
+++ b/tests/diagnostics/missing-semicolon-after-semantic.slang.expected
@@ -0,0 +1,6 @@
+result code = -1
+standard error = {
+tests/diagnostics/missing-semicolon-after-semantic.slang(9): error 20001: unexpected '}', expected ';'
+}
+standard output = {
+}
diff --git a/tests/front-end/uav-write.slang b/tests/front-end/uav-write.slang
new file mode 100644
index 000000000..c70af26a3
--- /dev/null
+++ b/tests/front-end/uav-write.slang
@@ -0,0 +1,20 @@
+// uav-write.slang
+//TEST:SIMPLE:
+
+// Just confirming that code that writes to a UAV will type-check.
+
+RWTexture2D<float4> gOutput;
+
+float4 test(uint2 coord, float4 value)
+{
+ // read
+ value = value + gOutput[coord];
+
+ // write
+ gOutput[coord] = value;
+
+ // read-modify-write
+ gOutput[coord] += value;
+
+ return value;
+} \ No newline at end of file