From d3ad6bb4997d3b7ba2dc9653a2d5f7dc965b150f Mon Sep 17 00:00:00 2001 From: Julius Ikkala Date: Fri, 17 Jan 2025 03:06:00 +0200 Subject: 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 --- source/slang/slang-lookup.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) (limited to 'source/slang/slang-lookup.cpp') 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; -- cgit v1.2.3