summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-check-expr.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-check-expr.cpp')
-rw-r--r--source/slang/slang-check-expr.cpp48
1 files changed, 23 insertions, 25 deletions
diff --git a/source/slang/slang-check-expr.cpp b/source/slang/slang-check-expr.cpp
index f4c8cd847..a530eb8f0 100644
--- a/source/slang/slang-check-expr.cpp
+++ b/source/slang/slang-check-expr.cpp
@@ -455,21 +455,24 @@ DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr(
// Another exception is if we are accessing a property
// that provides a [nonmutating] setter.
- if (!expr->type.isLeftValue && as<PropertyDecl>(declRef.getDecl()))
+ if (!expr->type.isLeftValue)
{
- bool isLValue = false;
- for (auto member : as<ContainerDecl>(declRef.getDecl())->members)
+ if (auto propertyDecl = as<PropertyDecl>(declRef.getDecl()))
{
- if (as<SetterDecl>(member) || as<RefAccessorDecl>(member))
+ bool isLValue = false;
+ for (auto member : propertyDecl->getDirectMemberDeclsOfType<AccessorDecl>())
{
- if (member->findModifier<NonmutatingAttribute>())
+ if (as<SetterDecl>(member) || as<RefAccessorDecl>(member))
{
- isLValue = true;
+ if (member->findModifier<NonmutatingAttribute>())
+ {
+ isLValue = true;
+ }
+ break;
}
- break;
}
+ expr->type.isLeftValue = isLValue;
}
- expr->type.isLeftValue = isLValue;
}
}
else
@@ -479,7 +482,7 @@ DeclRefExpr* SemanticsVisitor::ConstructDeclRefExpr(
if (auto propertyDecl = as<PropertyDecl>(declRef.getDecl()))
{
bool isLValue = false;
- for (auto member : propertyDecl->members)
+ for (auto member : propertyDecl->getDirectMemberDeclsOfType<AccessorDecl>())
{
if (as<SetterDecl>(member) || as<RefAccessorDecl>(member))
{
@@ -681,12 +684,11 @@ Expr* SemanticsVisitor::maybeUseSynthesizedDeclForLookupResult(
createDefaultSubstitutionsIfNeeded(m_astBuilder, this, makeDeclRef(structDecl));
typeDef->type.type = DeclRefType::create(m_astBuilder, synthDeclRef);
- structDecl->members.add(typeDef);
+ structDecl->addDirectMemberDecl(typeDef);
synthesizedDecl->nameAndLoc.name = item.declRef.getName();
synthesizedDecl->loc = parent->loc;
- parent->addMember(synthesizedDecl);
- parent->invalidateMemberDictionary();
+ parent->addDirectMemberDecl(synthesizedDecl);
// Mark the newly synthesized decl as `ToBeSynthesized` so future checking can
// differentiate it from user-provided definitions, and proceed to fill in its
@@ -711,8 +713,7 @@ Expr* SemanticsVisitor::maybeUseSynthesizedDeclForLookupResult(
synthesizedDecl = parent;
- parent->addMember(typeDef);
- parent->invalidateMemberDictionary();
+ parent->addDirectMemberDecl(typeDef);
markSelfDifferentialMembersOfType(parent, subType);
}
@@ -1293,17 +1294,14 @@ bool SemanticsVisitor::canStructBeUsedAsSelfDifferentialType(AggTypeDecl* aggTyp
// and their differential types are the same as the original types.
//
bool canBeUsed = true;
- for (auto member : aggTypeDecl->members)
+ for (auto varDecl : aggTypeDecl->getDirectMemberDeclsOfType<VarDecl>())
{
- if (auto varDecl = as<VarDecl>(member))
+ // Try to get the differential type of the member.
+ Type* diffType = tryGetDifferentialType(getASTBuilder(), varDecl->getType());
+ if (!diffType || !diffType->equals(varDecl->getType()))
{
- // Try to get the differential type of the member.
- Type* diffType = tryGetDifferentialType(getASTBuilder(), varDecl->getType());
- if (!diffType || !diffType->equals(varDecl->getType()))
- {
- canBeUsed = false;
- break;
- }
+ canBeUsed = false;
+ break;
}
}
return canBeUsed;
@@ -4290,7 +4288,7 @@ Expr* SemanticsExprVisitor::visitLambdaExpr(LambdaExpr* lambdaExpr)
{
nameBuilder << getText(m_parentFunc->getName());
nameBuilder << "_";
- nameBuilder << m_parentFunc->members.getCount();
+ nameBuilder << m_parentFunc->getDirectMemberDeclCount();
}
auto name = getName(nameBuilder.getBuffer());
lambdaStructDecl->nameAndLoc.name = name;
@@ -4315,7 +4313,7 @@ Expr* SemanticsExprVisitor::visitLambdaExpr(LambdaExpr* lambdaExpr)
synthesizer.popScope();
funcDecl->body = lambdaExpr->bodyStmt;
- for (auto param : lambdaExpr->paramScopeDecl->members)
+ for (auto param : lambdaExpr->paramScopeDecl->getDirectMemberDecls())
{
funcDecl->addMember(param);
}