summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-lookup.cpp
diff options
context:
space:
mode:
authorJulius Ikkala <julius.ikkala@gmail.com>2025-01-17 03:06:00 +0200
committerGitHub <noreply@github.com>2025-01-17 01:06:00 +0000
commitd3ad6bb4997d3b7ba2dc9653a2d5f7dc965b150f (patch)
tree4726f721cec95ec5ea2ec8408a081ca93338e923 /source/slang/slang-lookup.cpp
parente771f1945ed692168a2634d66a0907acc9c68858 (diff)
Fix cyclic lookups with UnscopedEnums (#6110)
* Fix cyclic lookups with UnscopedEnums * Add test with multiple unscoped enums with explicit types --------- Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source/slang/slang-lookup.cpp')
-rw-r--r--source/slang/slang-lookup.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/source/slang/slang-lookup.cpp b/source/slang/slang-lookup.cpp
index e4f2b188d..3667e2cd2 100644
--- a/source/slang/slang-lookup.cpp
+++ b/source/slang/slang-lookup.cpp
@@ -237,6 +237,12 @@ static void _lookUpDirectAndTransparentMembers(
if ((int)request.mask & (int)LookupMask::Attribute)
return;
+ // Also skip transparent members if they're explicitly excluded by the
+ // request. This prevents cyclic lookups e.g. when looking up UnscopedEnum's
+ // underlying types.
+ if (((int)request.options & (int)LookupOptions::IgnoreTransparentMembers) != 0)
+ return;
+
for (auto transparentInfo : containerDecl->getTransparentMembers())
{
// The reference to the transparent member should use the same
@@ -1059,11 +1065,16 @@ LookupResult lookUp(
Scope* scope,
LookupMask mask,
bool considerAllLocalNamesInScope,
- Decl* declToExclude)
+ Decl* declToExclude,
+ bool ignoreTransparentMembers)
{
LookupResult result;
- const auto options = considerAllLocalNamesInScope ? LookupOptions::ConsiderAllLocalNamesInScope
- : LookupOptions::None;
+ const auto options =
+ (LookupOptions)((int)(considerAllLocalNamesInScope
+ ? LookupOptions::ConsiderAllLocalNamesInScope
+ : LookupOptions::None) |
+ (int)(ignoreTransparentMembers ? LookupOptions::IgnoreTransparentMembers
+ : LookupOptions::None));
LookupRequest request = initLookupRequest(semantics, name, mask, options, scope, declToExclude);
_lookUpInScopes(astBuilder, name, request, result);
return result;