summaryrefslogtreecommitdiff
path: root/source/slang/slang-lookup.cpp
diff options
context:
space:
mode:
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;