Skip to content

Commit 9436899

Browse files
authored
Merge pull request #65219 from DougGregor/reference-cycle-visible-name-lookup
2 parents ccf57da + 68829ed commit 9436899

File tree

4 files changed

+79
-21
lines changed

4 files changed

+79
-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_other.swift

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
// Expanding macros that are defined in terms of other macros.
2+
3+
// RUN: %empty-directory(%t)
4+
// 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
5+
6+
// Diagnostics testing
7+
// RUN: %target-typecheck-verify-swift -swift-version 5 -enable-experimental-feature FreestandingMacros -load-plugin-library %t/%target-library-name(MacroDefinition) -I %swift-host-lib-dir -module-name MacroUser -DTEST_DIAGNOSTICS
8+
9+
// Execution testing
10+
// RUN: %target-build-swift -swift-version 5 -enable-experimental-feature FreestandingMacros -load-plugin-library %t/%target-library-name(MacroDefinition) -I %swift-host-lib-dir -L %swift-host-lib-dir %s -o %t/main -module-name MacroUser
11+
// RUN: %target-run %t/main | %FileCheck %s
12+
// RUN: %target-codesign %t/main
13+
// REQUIRES: swift_swift_parser, executable_test
14+
15+
@freestanding(expression) macro stringify<T>(_ value: T) -> (T, String) = #externalMacro(module: "MacroDefinition", type: "StringifyMacro")
16+
17+
@freestanding(expression) macro stringifySeven() -> (Int, String) = #stringify(7)
18+
19+
@freestanding(expression) macro recurse(_: Bool) = #externalMacro(module: "MacroDefinition", type: "RecursiveMacro")
20+
21+
@freestanding(expression) macro recurseThrough(_ value: Bool) = #recurse(value)
22+
23+
func testFreestandingExpansionOfOther() {
24+
// CHECK: ---testFreestandingExpansionOfOther
25+
print("---testFreestandingExpansionOfOther")
26+
27+
// CHECK-NEXT: (7, "7")
28+
print(#stringifySeven)
29+
30+
#recurseThrough(false)
31+
32+
#if TEST_DIAGNOSTICS
33+
#recurseThrough(true)
34+
// expected-note@-1 2{{in expansion of macro 'recurseThrough' here}}
35+
#endif
36+
}
37+
38+
testFreestandingExpansionOfOther()

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)