diff options
| -rw-r--r-- | source/slang/slang-ast-modifier.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-parser.cpp | 48 | ||||
| -rw-r--r-- | tests/language-feature/enums/strongly-typed-id.slang | 44 |
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; +} + |
