summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-modifier.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-modifier.cpp')
-rw-r--r--source/slang/slang-check-modifier.cpp45
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>();