diff options
| author | Ronan <ro.cailleau@gmail.com> | 2025-09-17 14:46:27 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-09-17 12:46:27 +0000 |
| commit | b5078d12127f4ab348b8d6d4c4e8139ba7bfb47f (patch) | |
| tree | 01444cbb7cf9ab7b28b08b9b842fdcb3f9a72a84 /source/slang/slang-parser.cpp | |
| parent | 64d23f2a56d9bd064557ae02a4f8a9d365cd9d60 (diff) | |
Added __magic_enum (#8436)
Fixes #8406 (and #8410).
`AddressSpace`, `MemoryScope` and `AccessQualifier` are no longer
`BaseType`.
I added a new `__magic_enum` (very similar to `__magic_type`) syntax to
be able to easily create values or these enums from the compiler. (I
don't know if it was the right way to do it, but it works and the
changes are small enough?).
I had a weird bug: `tests/language-feature/capability/address-of.slang`
was failing in `IRBuilder::_findOrEmitConstant(IRConstant& keyInst)`.
When needing a new `u64(0)`, it did not find it in the `ConstantMap`
first, but then failed to add it right after because it already existed
in the map! But this was triggered by `IRPtrType*
IRBuilder::getPtrType(IROp op, IRType* valueType, AccessQualifier
accessQualifier, AddressSpace addressSpace)`, which is a strange
coincidence... but I could not find the issue in what I did. I ended up
bumping unordered_dense, and it solved the issue (so there was a bug in
there).
Diffstat (limited to 'source/slang/slang-parser.cpp')
| -rw-r--r-- | source/slang/slang-parser.cpp | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/source/slang/slang-parser.cpp b/source/slang/slang-parser.cpp index 5b6f30477..196b2efa8 100644 --- a/source/slang/slang-parser.cpp +++ b/source/slang/slang-parser.cpp @@ -9388,7 +9388,16 @@ static NodeBase* parseBuiltinRequirementModifier(Parser* parser, void* /*userDat return modifier; } -static NodeBase* parseMagicTypeModifier(Parser* parser, void* /*userData*/) +enum class MagicTypeModifierKind +{ + Type, + Enum, +}; + +static NodeBase* parseMagicTypeModifierImpl( + Parser* parser, + void* /*userData*/, + MagicTypeModifierKind kind) { MagicTypeModifier* modifier = parser->astBuilder->create<MagicTypeModifier>(); parser->ReadToken(TokenType::LParent); @@ -9398,8 +9407,14 @@ static NodeBase* parseMagicTypeModifier(Parser* parser, void* /*userData*/) modifier->tag = uint32_t(stringToInt(parser->ReadToken(TokenType::IntegerLiteral).getContent())); } - auto syntaxClass = parser->astBuilder->findSyntaxClass(getName(parser, modifier->magicName)); - if (syntaxClass) + + if (kind == MagicTypeModifierKind::Enum) + { + modifier->magicNodeType = getSyntaxClass<EnumTypeType>(); + } + else if ( + auto syntaxClass = + parser->astBuilder->findSyntaxClass(getName(parser, modifier->magicName))) { modifier->magicNodeType = syntaxClass; } @@ -9410,6 +9425,16 @@ static NodeBase* parseMagicTypeModifier(Parser* parser, void* /*userData*/) return modifier; } +static NodeBase* parseMagicTypeModifier(Parser* parser, void* userData) +{ + return parseMagicTypeModifierImpl(parser, userData, MagicTypeModifierKind::Type); +} + +static NodeBase* parseMagicEnumModifier(Parser* parser, void* userData) +{ + return parseMagicTypeModifierImpl(parser, userData, MagicTypeModifierKind::Enum); +} + static NodeBase* parseIntrinsicTypeModifier(Parser* parser, void* /*userData*/) { IntrinsicTypeModifier* modifier = parser->astBuilder->create<IntrinsicTypeModifier>(); @@ -9634,6 +9659,7 @@ static const SyntaxParseInfo g_parseSyntaxEntries[] = { _makeParseModifier("__builtin_requirement", parseBuiltinRequirementModifier), _makeParseModifier("__magic_type", parseMagicTypeModifier), + _makeParseModifier("__magic_enum", parseMagicEnumModifier), _makeParseModifier("__intrinsic_type", parseIntrinsicTypeModifier), _makeParseModifier("__implicit_conversion", parseImplicitConversionModifier), |
