Skip to content

Commit 70be0b6

Browse files
authored
Merge pull request swiftlang#70838 from DougGregor/freestanding-macro-discriminators
Ensure that freestanding macros get consistent discriminators
2 parents 744e10c + be2466c commit 70be0b6

14 files changed

+62
-96
lines changed

include/swift/AST/Decl.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -792,10 +792,6 @@ class alignas(1 << DeclAlignInBits) Decl : public ASTAllocated<Decl> {
792792
NumberOfVTableEntries : 2
793793
);
794794

795-
SWIFT_INLINE_BITFIELD(MacroExpansionDecl, Decl, 16,
796-
Discriminator : 16
797-
);
798-
799795
} Bits;
800796
// Turn back on clang-format now that we have defined our inline bitfields.
801797
// clang-format on
@@ -9008,8 +9004,6 @@ class MacroDecl : public GenericContext, public ValueDecl {
90089004
class MacroExpansionDecl : public Decl, public FreestandingMacroExpansion {
90099005

90109006
public:
9011-
enum : unsigned { InvalidDiscriminator = 0xFFFF };
9012-
90139007
MacroExpansionDecl(DeclContext *dc, MacroExpansionInfo *info);
90149008

90159009
static MacroExpansionDecl *create(DeclContext *dc, SourceLoc poundLoc,
@@ -9029,24 +9023,6 @@ class MacroExpansionDecl : public Decl, public FreestandingMacroExpansion {
90299023
/// Enumerate the nodes produced by expanding this macro expansion.
90309024
void forEachExpandedNode(llvm::function_ref<void(ASTNode)> callback) const;
90319025

9032-
/// Returns a discriminator which determines this macro expansion's index
9033-
/// in the sequence of macro expansions within the current function.
9034-
unsigned getDiscriminator() const;
9035-
9036-
/// Retrieve the raw discriminator, which may not have been computed yet.
9037-
///
9038-
/// Only use this for queries that are checking for (e.g.) reentrancy or
9039-
/// intentionally do not want to initiate verification.
9040-
unsigned getRawDiscriminator() const {
9041-
return Bits.MacroExpansionDecl.Discriminator;
9042-
}
9043-
9044-
void setDiscriminator(unsigned discriminator) {
9045-
assert(getRawDiscriminator() == InvalidDiscriminator);
9046-
assert(discriminator != InvalidDiscriminator);
9047-
Bits.MacroExpansionDecl.Discriminator = discriminator;
9048-
}
9049-
90509026
static bool classof(const Decl *D) {
90519027
return D->getKind() == DeclKind::MacroExpansion;
90529028
}

include/swift/AST/Expr.h

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -369,11 +369,6 @@ class alignas(8) Expr : public ASTAllocated<Expr> {
369369
NumElements : 32
370370
);
371371

372-
SWIFT_INLINE_BITFIELD(MacroExpansionExpr, Expr, (16-NumExprBits)+16,
373-
: 16 - NumExprBits, // Align and leave room for subclasses
374-
Discriminator : 16
375-
);
376-
377372
} Bits;
378373
// clang-format on
379374

@@ -6309,7 +6304,6 @@ class MacroExpansionExpr final : public Expr,
63096304
: Expr(ExprKind::MacroExpansion, isImplicit, ty),
63106305
FreestandingMacroExpansion(FreestandingMacroKind::Expr, info), DC(dc),
63116306
Rewritten(nullptr), Roles(roles), SubstituteDecl(nullptr) {
6312-
Bits.MacroExpansionExpr.Discriminator = InvalidDiscriminator;
63136307
}
63146308

63156309
static MacroExpansionExpr *
@@ -6333,24 +6327,6 @@ class MacroExpansionExpr final : public Expr,
63336327
DeclContext *getDeclContext() const { return DC; }
63346328
void setDeclContext(DeclContext *dc) { DC = dc; }
63356329

6336-
/// Returns a discriminator which determines this macro expansion's index
6337-
/// in the sequence of macro expansions within the current function.
6338-
unsigned getDiscriminator() const;
6339-
6340-
/// Retrieve the raw discriminator, which may not have been computed yet.
6341-
///
6342-
/// Only use this for queries that are checking for (e.g.) reentrancy or
6343-
/// intentionally do not want to initiate verification.
6344-
unsigned getRawDiscriminator() const {
6345-
return Bits.MacroExpansionExpr.Discriminator;
6346-
}
6347-
6348-
void setDiscriminator(unsigned discriminator) {
6349-
assert(getRawDiscriminator() == InvalidDiscriminator);
6350-
assert(discriminator != InvalidDiscriminator);
6351-
Bits.MacroExpansionExpr.Discriminator = discriminator;
6352-
}
6353-
63546330
SourceRange getSourceRange() const {
63556331
return getExpansionInfo()->getSourceRange();
63566332
}

include/swift/AST/FreestandingMacroExpansion.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ struct MacroExpansionInfo : ASTAllocated<MacroExpansionInfo> {
4545
/// The referenced macro.
4646
ConcreteDeclRef macroRef;
4747

48+
enum : unsigned { InvalidDiscriminator = 0xFFFF };
49+
50+
unsigned Discriminator = InvalidDiscriminator;
51+
4852
MacroExpansionInfo(SourceLoc sigilLoc, DeclNameRef moduleName,
4953
DeclNameLoc moduleNameLoc, DeclNameRef macroName,
5054
DeclNameLoc macroNameLoc, SourceLoc leftAngleLoc,
@@ -71,12 +75,12 @@ enum class FreestandingMacroKind {
7175
/// A base class of either 'MacroExpansionExpr' or 'MacroExpansionDecl'.
7276
class FreestandingMacroExpansion {
7377
llvm::PointerIntPair<MacroExpansionInfo *, 1, FreestandingMacroKind>
74-
infoAndKind;
78+
infoAndKind;
7579

7680
protected:
7781
FreestandingMacroExpansion(FreestandingMacroKind kind,
7882
MacroExpansionInfo *info)
79-
: infoAndKind(info, kind) {}
83+
: infoAndKind(info, kind) {}
8084

8185
public:
8286
MacroExpansionInfo *getExpansionInfo() const {
@@ -114,7 +118,13 @@ class FreestandingMacroExpansion {
114118

115119
DeclContext *getDeclContext() const;
116120
SourceRange getSourceRange() const;
121+
122+
/// Returns a discriminator which determines this macro expansion's index
123+
/// in the sequence of macro expansions within the current context.
117124
unsigned getDiscriminator() const;
125+
126+
/// Returns the raw discriminator, for debugging purposes only.
127+
unsigned getRawDiscriminator() const;
118128
};
119129

120130
} // namespace swift

lib/AST/ASTVerifier.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2472,6 +2472,10 @@ class Verifier : public ASTWalker {
24722472
}
24732473

24742474
void verifyChecked(MacroExpansionExpr *expansion) {
2475+
// If there is a substitute decl, we'll end up checking that instead.
2476+
if (expansion->getSubstituteDecl())
2477+
return;
2478+
24752479
MacroExpansionDiscriminatorKey key{
24762480
MacroDiscriminatorContext::getParentOf(expansion).getOpaqueValue(),
24772481
expansion->getMacroName().getBaseName().getIdentifier()

lib/AST/Decl.cpp

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11680,7 +11680,6 @@ MacroExpansionDecl::MacroExpansionDecl(DeclContext *dc,
1168011680
MacroExpansionInfo *info)
1168111681
: Decl(DeclKind::MacroExpansion, dc),
1168211682
FreestandingMacroExpansion(FreestandingMacroKind::Decl, info) {
11683-
Bits.MacroExpansionDecl.Discriminator = InvalidDiscriminator;
1168411683
}
1168511684

1168611685
MacroExpansionDecl *
@@ -11704,23 +11703,6 @@ MacroExpansionDecl::create(
1170411703
return new (ctx) MacroExpansionDecl(dc, info);
1170511704
}
1170611705

11707-
unsigned MacroExpansionDecl::getDiscriminator() const {
11708-
if (getRawDiscriminator() != InvalidDiscriminator)
11709-
return getRawDiscriminator();
11710-
11711-
auto mutableThis = const_cast<MacroExpansionDecl *>(this);
11712-
auto dc = getDeclContext();
11713-
ASTContext &ctx = dc->getASTContext();
11714-
auto discriminatorContext =
11715-
MacroDiscriminatorContext::getParentOf(mutableThis);
11716-
mutableThis->setDiscriminator(
11717-
ctx.getNextMacroDiscriminator(
11718-
discriminatorContext, getMacroName().getBaseName()));
11719-
11720-
assert(getRawDiscriminator() != InvalidDiscriminator);
11721-
return getRawDiscriminator();
11722-
}
11723-
1172411706
void MacroExpansionDecl::forEachExpandedNode(
1172511707
llvm::function_ref<void(ASTNode)> callback
1172611708
) const {

lib/AST/Expr.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2786,23 +2786,6 @@ MacroExpansionExpr *MacroExpansionExpr::create(
27862786
return new (ctx) MacroExpansionExpr(dc, info, roles, isImplicit, ty);
27872787
}
27882788

2789-
unsigned MacroExpansionExpr::getDiscriminator() const {
2790-
if (getRawDiscriminator() != InvalidDiscriminator)
2791-
return getRawDiscriminator();
2792-
2793-
auto mutableThis = const_cast<MacroExpansionExpr *>(this);
2794-
auto dc = getDeclContext();
2795-
ASTContext &ctx = dc->getASTContext();
2796-
auto discriminatorContext =
2797-
MacroDiscriminatorContext::getParentOf(mutableThis);
2798-
mutableThis->setDiscriminator(
2799-
ctx.getNextMacroDiscriminator(
2800-
discriminatorContext, getMacroName().getBaseName()));
2801-
2802-
assert(getRawDiscriminator() != InvalidDiscriminator);
2803-
return getRawDiscriminator();
2804-
}
2805-
28062789
MacroExpansionDecl *MacroExpansionExpr::createSubstituteDecl() {
28072790
auto dc = DC;
28082791
if (auto *tlcd = dyn_cast_or_null<TopLevelCodeDecl>(dc->getAsDecl()))

lib/AST/FreestandingMacroExpansion.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "swift/AST/FreestandingMacroExpansion.h"
14+
#include "swift/AST/ASTContext.h"
1415
#include "swift/AST/Decl.h"
1516
#include "swift/AST/Expr.h"
17+
#include "swift/AST/MacroDiscriminatorContext.h"
1618

1719
using namespace swift;
1820

@@ -43,7 +45,24 @@ SourceRange FreestandingMacroExpansion::getSourceRange() const {
4345
FORWARD_VARIANT(getSourceRange);
4446
}
4547
unsigned FreestandingMacroExpansion::getDiscriminator() const {
46-
FORWARD_VARIANT(getDiscriminator);
48+
auto info = getExpansionInfo();
49+
if (info->Discriminator != MacroExpansionInfo::InvalidDiscriminator)
50+
return info->Discriminator;
51+
52+
auto mutableThis = const_cast<FreestandingMacroExpansion *>(this);
53+
auto dc = getDeclContext();
54+
ASTContext &ctx = dc->getASTContext();
55+
auto discriminatorContext =
56+
MacroDiscriminatorContext::getParentOf(mutableThis);
57+
info->Discriminator = ctx.getNextMacroDiscriminator(
58+
discriminatorContext, getMacroName().getBaseName());
59+
60+
assert(info->Discriminator != MacroExpansionInfo::InvalidDiscriminator);
61+
return info->Discriminator;
62+
}
63+
64+
unsigned FreestandingMacroExpansion::getRawDiscriminator() const {
65+
return getExpansionInfo()->Discriminator;
4766
}
4867

4968
ASTNode FreestandingMacroExpansion::getASTNode() {

test/Macros/Inputs/AnonTypes1.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#anonymousTypes(public: true) { "hello" }

test/Macros/Inputs/AnonTypes2.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
#anonymousTypes(public: true) { "hello" }
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// REQUIRES: swift_swift_parser, executable_test
2+
3+
// RUN: %empty-directory(%t)
4+
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/Inputs/syntax_macro_definitions.swift
5+
6+
@freestanding(declaration)
7+
macro anonymousTypes(public: Bool, _: () -> String) = #externalMacro(module: "MacroDefinition", type: "DefineAnonymousTypesMacro")
8+
9+
// RUN: %target-swift-frontend -swift-version 5 -emit-ir -load-plugin-library %t/%target-library-name(MacroDefinition) -module-name MacroUser %S/Inputs/AnonTypes1.swift %S/Inputs/AnonTypes2.swift %s -o - -g | %FileCheck --check-prefix CHECK-IR %s
10+
11+
// CHECK-IR: $s9MacroUser33{{.*}}14anonymousTypesfMf_4namefMu_
12+
// CHECK-IR-NOT: $s9MacroUser33{{.*}}14anonymousTypesfMf0_4namefMu_
13+
// CHECK-IR: $s9MacroUser33{{.*}}14anonymousTypesfMf_4namefMu_
14+
// CHECK-IR-NOT: $s9MacroUser33{{.*}}14anonymousTypesfMf0_4namefMu_

0 commit comments

Comments
 (0)