Skip to content

Commit 4f6ab4b

Browse files
committed
Anchor the macro-resolution request on the declaration to which the macro is attached
The macro-resolution request for an attached macro was expressed in terms of the custom attribute and the declaration context enclosing the attribute. While the declaration context is the correct one for resolving the types and arguments of the custom attribute, the declaration provides a better anchor for cases where the same attribute applies to multiple declarations, e.g., with member-attribute macros, leading to false cyclic references.
1 parent 5abb77d commit 4f6ab4b

File tree

5 files changed

+8
-6
lines changed

5 files changed

+8
-6
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3258,7 +3258,7 @@ void simple_display(llvm::raw_ostream &out,
32583258
class ResolveMacroRequest
32593259
: public SimpleRequest<ResolveMacroRequest,
32603260
ConcreteDeclRef(UnresolvedMacroReference,
3261-
DeclContext *),
3261+
const Decl *),
32623262
RequestFlags::Cached> {
32633263
public:
32643264
using SimpleRequest::SimpleRequest;
@@ -3268,7 +3268,7 @@ class ResolveMacroRequest
32683268

32693269
ConcreteDeclRef
32703270
evaluate(Evaluator &evaluator, UnresolvedMacroReference macroRef,
3271-
DeclContext *dc) const;
3271+
const Decl *decl) const;
32723272

32733273
public:
32743274
bool isCached() const { return true; }

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ SWIFT_REQUEST(TypeChecker, ResolveImplicitMemberRequest,
349349
evaluator::SideEffect(NominalTypeDecl *, ImplicitMemberAction),
350350
Uncached, NoLocationInfo)
351351
SWIFT_REQUEST(TypeChecker, ResolveMacroRequest,
352-
ConcreteDeclRef(UnresolvedMacroReference, DeclContext *),
352+
ConcreteDeclRef(UnresolvedMacroReference, const Decl *),
353353
Cached, NoLocationInfo)
354354
SWIFT_REQUEST(TypeChecker, ResolveTypeEraserTypeRequest,
355355
Type(ProtocolDecl *, TypeEraserAttr *),

lib/AST/Decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -445,7 +445,7 @@ void Decl::forEachAttachedMacro(MacroRole role,
445445
MacroDecl *Decl::getResolvedMacro(CustomAttr *customAttr) const {
446446
auto declRef = evaluateOrDefault(
447447
getASTContext().evaluator,
448-
ResolveMacroRequest{customAttr, getDeclContext()},
448+
ResolveMacroRequest{customAttr, this},
449449
ConcreteDeclRef());
450450

451451
return dyn_cast_or_null<MacroDecl>(declRef.getDecl());

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3796,7 +3796,7 @@ ExpandMacroExpansionDeclRequest::evaluate(Evaluator &evaluator,
37963796

37973797
// Resolve macro candidates.
37983798
auto macro = evaluateOrDefault(
3799-
ctx.evaluator, ResolveMacroRequest{MED, dc},
3799+
ctx.evaluator, ResolveMacroRequest{MED, MED},
38003800
ConcreteDeclRef());
38013801
if (!macro)
38023802
return None;

lib/Sema/TypeCheckMacros.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1478,7 +1478,9 @@ swift::expandConformances(CustomAttr *attr, MacroDecl *macro,
14781478
ConcreteDeclRef
14791479
ResolveMacroRequest::evaluate(Evaluator &evaluator,
14801480
UnresolvedMacroReference macroRef,
1481-
DeclContext *dc) const {
1481+
const Decl *decl) const {
1482+
auto dc = decl->getDeclContext();
1483+
14821484
// Macro expressions and declarations have their own stored macro
14831485
// reference. Use it if it's there.
14841486
if (auto *expr = macroRef.getExpr()) {

0 commit comments

Comments
 (0)