summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorArielG-NV <159081215+ArielG-NV@users.noreply.github.com>2024-04-16 22:01:06 -0400
committerGitHub <noreply@github.com>2024-04-16 19:01:06 -0700
commit282da4ac94d60d3244f4d72085e66fb82cf5abd8 (patch)
treed4c2b7d952ffbcb3f3e6debe6648bedb38b0fc66 /source
parentd5d39dda2ec02c1dd21ba34a89f74b27092efcdd (diff)
Fix for unscoped enums circular reference causing an error, #3959 (#3962)
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-check-decl.cpp11
-rw-r--r--source/slang/slang-lookup.cpp4
2 files changed, 11 insertions, 4 deletions
diff --git a/source/slang/slang-check-decl.cpp b/source/slang/slang-check-decl.cpp
index d35502235..131d30d98 100644
--- a/source/slang/slang-check-decl.cpp
+++ b/source/slang/slang-check-decl.cpp
@@ -2380,8 +2380,15 @@ namespace Slang
{
// check the type being inherited from
auto base = inheritanceDecl->base;
- CheckConstraintSubType(base);
- base = TranslateTypeNode(base);
+ Decl* toExclude = nullptr;
+ Decl* parent = getParentDecl(inheritanceDecl);
+ // We exclude in the case that a circular reference is possible. This is when a parent is a transparent decl.
+ // If we just blanket "block" all ensure's of a parent a generic may fail when trying to fetch a parent
+ if (parent->findModifier<TransparentModifier>())
+ toExclude = parent;
+ SemanticsDeclVisitorBase baseVistor(this->withDeclToExcludeFromLookup(toExclude));
+ baseVistor.CheckConstraintSubType(base);
+ base = baseVistor.TranslateTypeNode(base);
inheritanceDecl->base = base;
// Note: we do not check whether the type being inherited from
diff --git a/source/slang/slang-lookup.cpp b/source/slang/slang-lookup.cpp
index 2be9d29e8..9c8b2fa0b 100644
--- a/source/slang/slang-lookup.cpp
+++ b/source/slang/slang-lookup.cpp
@@ -224,13 +224,13 @@ static void _lookUpDirectAndTransparentMembers(
}
}
- // TODO(tfoley): should we look up in the transparent decls
- // if we already has a hit in the current container?
for(auto transparentInfo : containerDecl->getTransparentMembers())
{
// The reference to the transparent member should use the same
// path as we used in referring to its parent.
DeclRef<Decl> transparentMemberDeclRef = astBuilder->getMemberDeclRef(parentDeclRef, transparentInfo.decl);
+ if (transparentMemberDeclRef.getDecl() == request.declToExclude)
+ continue;
// We need to leave a breadcrumb so that we know that the result
// of lookup involves a member lookup step here