diff options
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
| -rw-r--r-- | source/slang/slang-check-modifier.cpp | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/source/slang/slang-check-modifier.cpp b/source/slang/slang-check-modifier.cpp index e5249ac88..1d38fa802 100644 --- a/source/slang/slang-check-modifier.cpp +++ b/source/slang/slang-check-modifier.cpp @@ -273,20 +273,17 @@ AttributeDecl* SemanticsVisitor::lookUpAttributeDecl(Name* attributeName, Scope* // // TODO: This step should skip `static` fields. // - for (auto member : structDecl->members) + for (auto varMember : structDecl->getDirectMemberDeclsOfType<VarDecl>()) { - if (auto varMember = as<VarDecl>(member)) - { - ensureDecl(varMember, DeclCheckState::CanUseTypeOfValueDecl); + ensureDecl(varMember, DeclCheckState::CanUseTypeOfValueDecl); - ParamDecl* paramDecl = m_astBuilder->create<ParamDecl>(); - paramDecl->nameAndLoc = member->nameAndLoc; - paramDecl->type = varMember->type; - paramDecl->loc = member->loc; - paramDecl->setCheckState(DeclCheckState::DefinitionChecked); + ParamDecl* paramDecl = m_astBuilder->create<ParamDecl>(); + paramDecl->nameAndLoc = varMember->nameAndLoc; + paramDecl->type = varMember->type; + paramDecl->loc = varMember->loc; + paramDecl->setCheckState(DeclCheckState::DefinitionChecked); - attrDecl->addMember(paramDecl); - } + attrDecl->addMember(paramDecl); } // We need to end by putting the new attribute declaration @@ -298,8 +295,6 @@ AttributeDecl* SemanticsVisitor::lookUpAttributeDecl(Name* attributeName, Scope* // parentDecl->addMember(attrDecl); - SLANG_ASSERT(!parentDecl->isMemberDictionaryValid()); - // Finally, we perform any required semantic checks on // the newly constructed attribute decl. // @@ -1660,11 +1655,17 @@ Modifier* SemanticsVisitor::checkModifier( auto checkedAttr = checkAttribute(hlslUncheckedAttribute, syntaxNode); - if (as<UnscopedEnumAttribute>(checkedAttr)) + if (auto unscopedEnumAttr = as<UnscopedEnumAttribute>(checkedAttr)) { - if (auto parentDecl = as<ContainerDecl>(getParentDecl(as<Decl>(syntaxNode)))) - parentDecl->invalidateMemberDictionary(); - return getASTBuilder()->create<TransparentModifier>(); + auto transparentModifier = getASTBuilder()->create<TransparentModifier>(); + if (auto parentDecl = getParentDecl(as<Decl>(syntaxNode))) + { + parentDecl + ->_invalidateLookupAcceleratorsBecauseUnscopedEnumAttributeWillBeTurnedIntoTransparentModifier( + unscopedEnumAttr, + transparentModifier); + } + return transparentModifier; } return checkedAttr; } @@ -1940,7 +1941,7 @@ Modifier* SemanticsVisitor::checkModifier( // specialization constant with this ID. Int specConstId = cintVal->getValue(); - for (auto member : decl->parentDecl->members) + for (auto member : decl->parentDecl->getDirectMemberDecls()) { auto constantId = member->findModifier<VkConstantIdAttribute>(); if (constantId) @@ -2215,14 +2216,8 @@ void SemanticsVisitor::checkRayPayloadStructFields(StructDecl* structDecl) const HashSet<String> validStages("anyhit", "closesthit", "miss", "caller"); // Check each field in the struct - for (auto member : structDecl->members) + for (auto fieldVarDecl : structDecl->getDirectMemberDeclsOfType<VarDeclBase>()) { - auto fieldVarDecl = as<VarDeclBase>(member); - if (!fieldVarDecl) - { - continue; - } - auto readModifier = fieldVarDecl->findModifier<RayPayloadReadSemantic>(); auto writeModifier = fieldVarDecl->findModifier<RayPayloadWriteSemantic>(); |
