Skip to content

Commit ab682f1

Browse files
committed
[Macros] Break reference cycles involving visible name lookup
1 parent bdc3346 commit ab682f1

File tree

3 files changed

+41
-21
lines changed

3 files changed

+41
-21
lines changed

lib/AST/Decl.cpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -372,10 +372,12 @@ OrigDeclAttributes Decl::getOriginalAttrs() const {
372372
}
373373

374374
DeclAttributes Decl::getSemanticAttrs() const {
375-
auto mutableThis = const_cast<Decl *>(this);
376-
(void)evaluateOrDefault(getASTContext().evaluator,
377-
ExpandMemberAttributeMacros{mutableThis},
378-
{ });
375+
if (!getASTContext().evaluator.hasActiveResolveMacroRequest()) {
376+
auto mutableThis = const_cast<Decl *>(this);
377+
(void)evaluateOrDefault(getASTContext().evaluator,
378+
ExpandMemberAttributeMacros{mutableThis},
379+
{ });
380+
}
379381

380382
return getAttrs();
381383
}

lib/Sema/LookupVisibleDecls.cpp

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -255,17 +255,22 @@ static void doGlobalExtensionLookup(Type BaseType,
255255

256256
// Expand member macros.
257257
ASTContext &ctx = nominal->getASTContext();
258-
(void)evaluateOrDefault(
259-
ctx.evaluator,
260-
ExpandSynthesizedMemberMacroRequest{extension},
261-
false);
258+
if (!ctx.evaluator.hasActiveRequest(
259+
ExpandSynthesizedMemberMacroRequest{extension})) {
260+
(void)evaluateOrDefault(
261+
ctx.evaluator,
262+
ExpandSynthesizedMemberMacroRequest{extension},
263+
false);
264+
}
262265

263266
// Expand peer macros.
264267
for (auto *member : extension->getMembers()) {
265-
(void)evaluateOrDefault(
266-
ctx.evaluator,
267-
ExpandPeerMacroRequest{member},
268-
{});
268+
if (!ctx.evaluator.hasActiveRequest(ExpandPeerMacroRequest{member})) {
269+
(void)evaluateOrDefault(
270+
ctx.evaluator,
271+
ExpandPeerMacroRequest{member},
272+
{});
273+
}
269274
}
270275

271276
collectVisibleMemberDecls(CurrDC, LS, BaseType, extension, FoundDecls);
@@ -622,16 +627,21 @@ static void synthesizeMemberDeclsForLookup(NominalTypeDecl *NTD,
622627

623628
// Expand synthesized member macros.
624629
auto &ctx = NTD->getASTContext();
625-
(void)evaluateOrDefault(ctx.evaluator,
626-
ExpandSynthesizedMemberMacroRequest{NTD},
627-
false);
630+
if (!ctx.evaluator.hasActiveRequest(
631+
ExpandSynthesizedMemberMacroRequest{NTD})) {
632+
(void)evaluateOrDefault(ctx.evaluator,
633+
ExpandSynthesizedMemberMacroRequest{NTD},
634+
false);
635+
}
628636

629637
// Expand peer macros.
630638
for (auto *member : NTD->getMembers()) {
631-
(void)evaluateOrDefault(
632-
ctx.evaluator,
633-
ExpandPeerMacroRequest{member},
634-
{});
639+
if (!ctx.evaluator.hasActiveRequest(ExpandPeerMacroRequest{member})) {
640+
(void)evaluateOrDefault(
641+
ctx.evaluator,
642+
ExpandPeerMacroRequest{member},
643+
{});
644+
}
635645
}
636646

637647
synthesizePropertyWrapperVariables(NTD);

test/Macros/macro_expand_peers.swift

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
// RUN: %empty-directory(%t)
88
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -parse-as-library -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
9-
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -parse-as-library -disable-availability-checking
9+
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -parse-as-library -disable-availability-checking -DTEST_DIAGNOSTICS
1010

1111
// Check with the imported macro library vs. the local declaration of the macro.
1212
// RUN: %target-swift-frontend -swift-version 5 -emit-module -o %t/macro_library.swiftmodule %S/Inputs/macro_library.swift -module-name macro_library -load-plugin-library %t/%target-library-name(MacroDefinition)
1313

14-
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -parse-as-library -disable-availability-checking -DIMPORT_MACRO_LIBRARY -I %t
14+
// RUN: %target-typecheck-verify-swift -swift-version 5 -load-plugin-library %t/%target-library-name(MacroDefinition) -parse-as-library -disable-availability-checking -DIMPORT_MACRO_LIBRARY -I %t -DTEST_DIAGNOSTICS
1515

1616

1717
// RUN: %target-swift-frontend -swift-version 5 -typecheck -load-plugin-library %t/%target-library-name(MacroDefinition) -parse-as-library %s -disable-availability-checking -dump-macro-expansions > %t/expansions-dump.txt 2>&1
@@ -147,4 +147,12 @@ struct S2 {
147147
func g(a: Int, for b: String, _ value: Double) async -> String {
148148
return b
149149
}
150+
151+
#if TEST_DIAGNOSTICS
152+
// expected-error@+1{{cannot find 'nonexistent' in scope}}
153+
@addCompletionHandlerArbitrarily(nonexistent)
154+
func h(a: Int, for b: String, _ value: Double) async -> String {
155+
return b
156+
}
157+
#endif
150158
}

0 commit comments

Comments
 (0)