summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--source/slang/slang-ast-modifier.h2
-rw-r--r--source/slang/slang-parser.cpp48
-rw-r--r--tests/language-feature/enums/strongly-typed-id.slang44
3 files changed, 73 insertions, 21 deletions
diff --git a/source/slang/slang-ast-modifier.h b/source/slang/slang-ast-modifier.h
index bf79028d7..f430c5f7a 100644
--- a/source/slang/slang-ast-modifier.h
+++ b/source/slang/slang-ast-modifier.h
@@ -433,6 +433,8 @@ class IntrinsicTypeModifier : public Modifier
// The IR opcode to use when constructing a type
uint32_t irOp;
+ Token opToken;
+
// Additional literal opreands to provide when creating instances.
// (e.g., for a texture type this passes in shape/mutability info)
List<uint32_t> irOperands;
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp
index 59aff4dc0..e701a1c2b 100644
--- a/source/slang/slang-parser.cpp
+++ b/source/slang/slang-parser.cpp
@@ -6773,6 +6773,31 @@ namespace Slang
addBuiltinSyntaxImpl(session, scope, name, &parseSimpleSyntax, (void*) syntaxClass.classInfo, getClass<T>());
}
+ static IROp parseIROp(Parser* parser, Token& outToken)
+ {
+ if (AdvanceIf(parser, TokenType::OpSub))
+ {
+ outToken = parser->ReadToken();
+ return IROp(-stringToInt(outToken.getContent()));
+ }
+ else if (parser->LookAheadToken(TokenType::IntegerLiteral))
+ {
+ outToken = parser->ReadToken();
+ return IROp(stringToInt(outToken.getContent()));
+ }
+ else
+ {
+ outToken = parser->ReadToken(TokenType::Identifier);;
+ auto op = findIROp(outToken.getContent());
+
+ if (op == kIROp_Invalid)
+ {
+ parser->sink->diagnose(outToken, Diagnostics::unimplemented, "unknown intrinsic op");
+ }
+ return op;
+ }
+ }
+
static NodeBase* parseIntrinsicOpModifier(Parser* parser, void* /*userData*/)
{
IntrinsicOpModifier* modifier = parser->astBuilder->create<IntrinsicOpModifier>();
@@ -6794,26 +6819,7 @@ namespace Slang
//
if (AdvanceIf(parser, TokenType::LParent))
{
- if (AdvanceIf(parser, TokenType::OpSub))
- {
- modifier->op = IROp(-stringToInt(parser->ReadToken().getContent()));
- }
- else if (parser->LookAheadToken(TokenType::IntegerLiteral))
- {
- modifier->op = IROp(stringToInt(parser->ReadToken().getContent()));
- }
- else
- {
- modifier->opToken = parser->ReadToken(TokenType::Identifier);
-
- modifier->op = findIROp(modifier->opToken.getContent());
-
- if (modifier->op == kIROp_Invalid)
- {
- parser->sink->diagnose(modifier->opToken, Diagnostics::unimplemented, "unknown intrinsic op");
- }
- }
-
+ modifier->op = parseIROp(parser, modifier->opToken);
parser->ReadToken(TokenType::RParent);
}
@@ -7124,7 +7130,7 @@ namespace Slang
{
IntrinsicTypeModifier* modifier = parser->astBuilder->create<IntrinsicTypeModifier>();
parser->ReadToken(TokenType::LParent);
- modifier->irOp = uint32_t(stringToInt(parser->ReadToken(TokenType::IntegerLiteral).getContent()));
+ modifier->irOp = parseIROp(parser, modifier->opToken);
while( AdvanceIf(parser, TokenType::Comma) )
{
auto operand = uint32_t(stringToInt(parser->ReadToken(TokenType::IntegerLiteral).getContent()));
diff --git a/tests/language-feature/enums/strongly-typed-id.slang b/tests/language-feature/enums/strongly-typed-id.slang
new file mode 100644
index 000000000..70f655538
--- /dev/null
+++ b/tests/language-feature/enums/strongly-typed-id.slang
@@ -0,0 +1,44 @@
+//TEST(compute):COMPARE_COMPUTE(filecheck-buffer=CHECK): -shaderobj
+
+enum MyId : uint {}
+extension MyId { uint get() { return (uint)this; } }
+
+int test(MyId id)
+{
+ if (id.get() == 4)
+ {
+ return (int)id;
+ }
+ return 0;
+}
+
+__intrinsic_type(UInt)
+struct MyId2
+{
+ __init(uint val) { this = __slang_noop_cast<MyId2>(val); }
+
+ __intrinsic_op(0) int get();
+}
+
+int test2(MyId2 id)
+{
+ if (id.get() == 4)
+ {
+ return id.get();
+ }
+ return 0;
+}
+
+//TEST_INPUT:ubuffer(data=[0 0 0 0], stride=4):out,name=outputBuffer
+RWStructuredBuffer<uint> outputBuffer;
+
+[numthreads(4, 1, 1)]
+void computeMain(uint3 dispatchThreadID : SV_DispatchThreadID)
+{
+ uint tid = dispatchThreadID.x;
+ uint inVal = tid;
+ uint outVal = test(MyId(4)) + test2(MyId2(4));
+ // CHECK: 8
+ outputBuffer[tid] = outVal;
+}
+