Skip to content

Commit dd9fe56

Browse files
authored
Merge pull request #70706 from bnbarham/should-have-feature
[Basic] hasFeature should succeed for promoted language features
2 parents 26cc99d + d51c58a commit dd9fe56

File tree

12 files changed

+173
-182
lines changed

12 files changed

+173
-182
lines changed

include/swift/Basic/BasicBridging.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -178,8 +178,7 @@ void BridgedData_free(BridgedData data);
178178
//===----------------------------------------------------------------------===//
179179

180180
enum ENUM_EXTENSIBILITY_ATTR(open) BridgedFeature {
181-
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
182-
FeatureName,
181+
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description) FeatureName,
183182
#include "swift/Basic/Features.def"
184183
};
185184

include/swift/Basic/Feature.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,13 @@ class LangOptions;
2222

2323
/// Enumeration describing all of the named features.
2424
enum class Feature {
25-
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
26-
FeatureName,
25+
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description) FeatureName,
2726
#include "swift/Basic/Features.def"
2827
};
2928

3029
constexpr unsigned numFeatures() {
3130
enum Features {
32-
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
33-
FeatureName,
31+
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description) FeatureName,
3432
#include "swift/Basic/Features.def"
3533
NumFeatures
3634
};

include/swift/Basic/Features.def

Lines changed: 54 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
// features.
1515
//
1616
//
17-
// LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option)
17+
// LANGUAGE_FEATURE(FeatureName, SENumber, Description)
1818
//
1919
// The LANGUAGE_FEATURE macro describes each named feature that is
2020
// introduced in Swift. It allows Swift code to check for a particular
@@ -25,9 +25,6 @@
2525
// SENumber: The number assigned to this feature in the Swift Evolution
2626
// process, or 0 if there isn't one.
2727
// Description: A string literal describing the feature.
28-
// Option: either a reference to a language option in the form
29-
// "langOpts.<option name>" or "true" to indicate that it's always
30-
// enabled.
3128
//
3229
// Suppressible language features can be suppressed when printing
3330
// an interface without having to suppress the entire declaration they're
@@ -44,79 +41,76 @@
4441
#endif
4542

4643
#ifndef SUPPRESSIBLE_LANGUAGE_FEATURE
47-
#define SUPPRESSIBLE_LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
48-
LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option)
44+
#define SUPPRESSIBLE_LANGUAGE_FEATURE(FeatureName, SENumber, Description) \
45+
LANGUAGE_FEATURE(FeatureName, SENumber, Description)
4946
#endif
5047

5148
#ifndef UPCOMING_FEATURE
5249
# define UPCOMING_FEATURE(FeatureName, SENumber, Version) \
53-
LANGUAGE_FEATURE(FeatureName, SENumber, #FeatureName, \
54-
langOpts.hasFeature(#FeatureName))
50+
LANGUAGE_FEATURE(FeatureName, SENumber, #FeatureName)
5551
#endif
5652

5753
#ifndef EXPERIMENTAL_FEATURE
5854
// Warning: setting `AvailableInProd` to `true` on a feature means that the flag
5955
// cannot be dropped in the future.
6056
# define EXPERIMENTAL_FEATURE(FeatureName, AvailableInProd) \
61-
LANGUAGE_FEATURE(FeatureName, 0, #FeatureName, \
62-
langOpts.hasFeature(#FeatureName))
57+
LANGUAGE_FEATURE(FeatureName, 0, #FeatureName)
6358
#endif
6459

6560
#ifndef EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE
6661
# define EXPERIMENTAL_FEATURE_EXCLUDED_FROM_MODULE_INTERFACE(FeatureName, AvailableInProd) \
6762
EXPERIMENTAL_FEATURE(FeatureName, AvailableInProd)
6863
#endif
6964

70-
LANGUAGE_FEATURE(AsyncAwait, 296, "async/await", true)
71-
LANGUAGE_FEATURE(EffectfulProp, 310, "Effectful properties", true)
72-
LANGUAGE_FEATURE(MarkerProtocol, 0, "@_marker protocol", true)
73-
LANGUAGE_FEATURE(Actors, 0, "actors", true)
74-
LANGUAGE_FEATURE(ConcurrentFunctions, 0, "@concurrent functions", true)
75-
LANGUAGE_FEATURE(RethrowsProtocol, 0, "@rethrows protocol", true)
76-
LANGUAGE_FEATURE(GlobalActors, 316, "Global actors", true)
77-
LANGUAGE_FEATURE(BuiltinJob, 0, "Builtin.Job type", true)
78-
LANGUAGE_FEATURE(Sendable, 0, "Sendable and @Sendable", true)
79-
LANGUAGE_FEATURE(BuiltinExecutor, 0, "Builtin.Executor type", true)
80-
LANGUAGE_FEATURE(BuiltinContinuation, 0, "Continuation builtins", true)
81-
LANGUAGE_FEATURE(BuiltinHopToActor, 0, "Builtin.HopToActor", true)
82-
LANGUAGE_FEATURE(BuiltinTaskGroupWithArgument, 0, "TaskGroup builtins", true)
83-
LANGUAGE_FEATURE(InheritActorContext, 0, "@_inheritActorContext attribute", true)
84-
LANGUAGE_FEATURE(ImplicitSelfCapture, 0, "@_implicitSelfCapture attribute", true)
85-
LANGUAGE_FEATURE(BuiltinBuildTaskExecutor, 0, "TaskExecutor-building builtins", true)
86-
LANGUAGE_FEATURE(BuiltinBuildExecutor, 0, "Executor-building builtins", true)
87-
LANGUAGE_FEATURE(BuiltinBuildComplexEqualityExecutor, 0, "Executor-building for 'complexEquality executor' builtins", true)
88-
LANGUAGE_FEATURE(BuiltinBuildMainExecutor, 0, "MainActor executor building builtin", true)
89-
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroup, 0, "Task create in task group builtin with extra flags", true)
90-
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroupWithExecutor, 0, "Task create in task group builtin with extra flags", true)
91-
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskWithExecutor, 0, "Task create builtin with extra executor preference", true)
92-
LANGUAGE_FEATURE(BuiltinCopy, 0, "Builtin.copy()", true)
93-
LANGUAGE_FEATURE(BuiltinStackAlloc, 0, "Builtin.stackAlloc", true)
94-
LANGUAGE_FEATURE(BuiltinUnprotectedStackAlloc, 0, "Builtin.unprotectedStackAlloc", true)
95-
LANGUAGE_FEATURE(BuiltinAllocVector, 0, "Builtin.allocVector", true)
96-
LANGUAGE_FEATURE(BuiltinTaskRunInline, 0, "Builtin.taskRunInline", true)
97-
LANGUAGE_FEATURE(BuiltinUnprotectedAddressOf, 0, "Builtin.unprotectedAddressOf", true)
98-
LANGUAGE_FEATURE(NewCxxMethodSafetyHeuristics, 0, "Only import C++ methods that return pointers (projections) on owned types as unsafe", true)
99-
SUPPRESSIBLE_LANGUAGE_FEATURE(SpecializeAttributeWithAvailability, 0, "@_specialize attribute with availability", true)
100-
LANGUAGE_FEATURE(BuiltinAssumeAlignment, 0, "Builtin.assumeAlignment", true)
101-
LANGUAGE_FEATURE(BuiltinCreateTaskGroupWithFlags, 0, "Builtin.createTaskGroupWithFlags", true)
102-
SUPPRESSIBLE_LANGUAGE_FEATURE(UnsafeInheritExecutor, 0, "@_unsafeInheritExecutor", true)
103-
SUPPRESSIBLE_LANGUAGE_FEATURE(PrimaryAssociatedTypes2, 346, "Primary associated types", true)
104-
SUPPRESSIBLE_LANGUAGE_FEATURE(UnavailableFromAsync, 0, "@_unavailableFromAsync", true)
105-
SUPPRESSIBLE_LANGUAGE_FEATURE(NoAsyncAvailability, 340, "@available(*, noasync)", true)
106-
LANGUAGE_FEATURE(BuiltinIntLiteralAccessors, 368, "Builtin.IntLiteral accessors", true)
107-
LANGUAGE_FEATURE(Macros, 0, "Macros", hasSwiftSwiftParser)
108-
LANGUAGE_FEATURE(
109-
FreestandingExpressionMacros, 382, "Expression macros",
110-
hasSwiftSwiftParser)
111-
LANGUAGE_FEATURE(AttachedMacros, 389, "Attached macros", hasSwiftSwiftParser)
112-
LANGUAGE_FEATURE(ExtensionMacros, 402, "Extension macros", hasSwiftSwiftParser)
113-
LANGUAGE_FEATURE(MoveOnly, 390, "noncopyable types", true)
114-
LANGUAGE_FEATURE(MoveOnlyResilientTypes, 390, "non-@frozen noncopyable types with library evolution", true)
115-
LANGUAGE_FEATURE(ParameterPacks, 393, "Value and type parameter packs", true)
116-
SUPPRESSIBLE_LANGUAGE_FEATURE(LexicalLifetimes, 0, "@_eagerMove/@_noEagerMove/@_lexicalLifetimes annotations", true)
117-
LANGUAGE_FEATURE(FreestandingMacros, 397, "freestanding declaration macros", true)
118-
SUPPRESSIBLE_LANGUAGE_FEATURE(RetroactiveAttribute, 364, "@retroactive", true)
119-
LANGUAGE_FEATURE(TypedThrows, 413, "Typed throws", true)
65+
LANGUAGE_FEATURE(AsyncAwait, 296, "async/await")
66+
LANGUAGE_FEATURE(EffectfulProp, 310, "Effectful properties")
67+
LANGUAGE_FEATURE(MarkerProtocol, 0, "@_marker protocol")
68+
LANGUAGE_FEATURE(Actors, 0, "actors")
69+
LANGUAGE_FEATURE(ConcurrentFunctions, 0, "@concurrent functions")
70+
LANGUAGE_FEATURE(RethrowsProtocol, 0, "@rethrows protocol")
71+
LANGUAGE_FEATURE(GlobalActors, 316, "Global actors")
72+
LANGUAGE_FEATURE(BuiltinJob, 0, "Builtin.Job type")
73+
LANGUAGE_FEATURE(Sendable, 0, "Sendable and @Sendable")
74+
LANGUAGE_FEATURE(BuiltinExecutor, 0, "Builtin.Executor type")
75+
LANGUAGE_FEATURE(BuiltinContinuation, 0, "Continuation builtins")
76+
LANGUAGE_FEATURE(BuiltinHopToActor, 0, "Builtin.HopToActor")
77+
LANGUAGE_FEATURE(BuiltinTaskGroupWithArgument, 0, "TaskGroup builtins")
78+
LANGUAGE_FEATURE(InheritActorContext, 0, "@_inheritActorContext attribute")
79+
LANGUAGE_FEATURE(ImplicitSelfCapture, 0, "@_implicitSelfCapture attribute")
80+
LANGUAGE_FEATURE(BuiltinBuildTaskExecutor, 0, "TaskExecutor-building builtins")
81+
LANGUAGE_FEATURE(BuiltinBuildExecutor, 0, "Executor-building builtins")
82+
LANGUAGE_FEATURE(BuiltinBuildComplexEqualityExecutor, 0, "Executor-building for 'complexEquality executor' builtins")
83+
LANGUAGE_FEATURE(BuiltinBuildMainExecutor, 0, "MainActor executor building builtin")
84+
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroup, 0, "Task create in task group builtin with extra flags")
85+
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskInGroupWithExecutor, 0, "Task create in task group builtin with extra flags")
86+
LANGUAGE_FEATURE(BuiltinCreateAsyncTaskWithExecutor, 0, "Task create builtin with extra executor preference")
87+
LANGUAGE_FEATURE(BuiltinCopy, 0, "Builtin.copy()")
88+
LANGUAGE_FEATURE(BuiltinStackAlloc, 0, "Builtin.stackAlloc")
89+
LANGUAGE_FEATURE(BuiltinUnprotectedStackAlloc, 0, "Builtin.unprotectedStackAlloc")
90+
LANGUAGE_FEATURE(BuiltinAllocVector, 0, "Builtin.allocVector")
91+
LANGUAGE_FEATURE(BuiltinTaskRunInline, 0, "Builtin.taskRunInline")
92+
LANGUAGE_FEATURE(BuiltinUnprotectedAddressOf, 0, "Builtin.unprotectedAddressOf")
93+
LANGUAGE_FEATURE(NewCxxMethodSafetyHeuristics, 0, "Only import C++ methods that return pointers (projections) on owned types as unsafe")
94+
SUPPRESSIBLE_LANGUAGE_FEATURE(SpecializeAttributeWithAvailability, 0, "@_specialize attribute with availability")
95+
LANGUAGE_FEATURE(BuiltinAssumeAlignment, 0, "Builtin.assumeAlignment")
96+
LANGUAGE_FEATURE(BuiltinCreateTaskGroupWithFlags, 0, "Builtin.createTaskGroupWithFlags")
97+
SUPPRESSIBLE_LANGUAGE_FEATURE(UnsafeInheritExecutor, 0, "@_unsafeInheritExecutor")
98+
SUPPRESSIBLE_LANGUAGE_FEATURE(PrimaryAssociatedTypes2, 346, "Primary associated types")
99+
SUPPRESSIBLE_LANGUAGE_FEATURE(UnavailableFromAsync, 0, "@_unavailableFromAsync")
100+
SUPPRESSIBLE_LANGUAGE_FEATURE(NoAsyncAvailability, 340, "@available(*, noasync)")
101+
LANGUAGE_FEATURE(BuiltinIntLiteralAccessors, 368, "Builtin.IntLiteral accessors")
102+
LANGUAGE_FEATURE(Macros, 0, "Macros")
103+
LANGUAGE_FEATURE(FreestandingExpressionMacros, 382, "Expression macros")
104+
LANGUAGE_FEATURE(AttachedMacros, 389, "Attached macros")
105+
LANGUAGE_FEATURE(ExtensionMacros, 402, "Extension macros")
106+
LANGUAGE_FEATURE(MoveOnly, 390, "noncopyable types")
107+
LANGUAGE_FEATURE(MoveOnlyResilientTypes, 390, "non-@frozen noncopyable types with library evolution")
108+
LANGUAGE_FEATURE(ParameterPacks, 393, "Value and type parameter packs")
109+
SUPPRESSIBLE_LANGUAGE_FEATURE(LexicalLifetimes, 0, "@_eagerMove/@_noEagerMove/@_lexicalLifetimes annotations")
110+
LANGUAGE_FEATURE(FreestandingMacros, 397, "freestanding declaration macros")
111+
SUPPRESSIBLE_LANGUAGE_FEATURE(RetroactiveAttribute, 364, "@retroactive")
112+
SUPPRESSIBLE_LANGUAGE_FEATURE(ExtensionMacroAttr, 0, "@attached(extension)")
113+
LANGUAGE_FEATURE(TypedThrows, 413, "Typed throws")
120114

121115
UPCOMING_FEATURE(ConciseMagicFile, 274, 6)
122116
UPCOMING_FEATURE(ForwardTrailingClosures, 286, 6)
@@ -137,8 +131,6 @@ EXPERIMENTAL_FEATURE(CodeItemMacros, false)
137131
EXPERIMENTAL_FEATURE(BodyMacros, true)
138132
EXPERIMENTAL_FEATURE(TupleConformances, false)
139133

140-
SUPPRESSIBLE_LANGUAGE_FEATURE(ExtensionMacroAttr, 0, "@attached(extension)", true)
141-
142134
// Whether to enable @_used and @_section attributes
143135
EXPERIMENTAL_FEATURE(SymbolLinkageMarkers, true)
144136

include/swift/Basic/LangOptions.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -429,12 +429,6 @@ namespace swift {
429429
/// behavior. This is a staging flag, and will be removed in the future.
430430
bool EnableNewOperatorLookup = false;
431431

432-
/// The set of features that have been enabled.
433-
FixedBitSet<numFeatures(), Feature> Features;
434-
435-
/// Temporary flag to support LLDB's transition to using \c Features.
436-
bool EnableBareSlashRegexLiterals = false;
437-
438432
/// Use Clang function types for computing canonical types.
439433
/// If this option is false, the clang function types will still be computed
440434
/// but will not be used for checking type equality.
@@ -690,6 +684,12 @@ namespace swift {
690684
/// by name.
691685
bool hasFeature(llvm::StringRef featureName) const;
692686

687+
/// Enable the given feature.
688+
void enableFeature(Feature feature) { Features.insert(feature); }
689+
690+
/// Disable the given feature.
691+
void disableFeature(Feature feature) { Features.remove(feature); }
692+
693693
/// Sets the "_hasAtomicBitWidth" conditional.
694694
void setHasAtomicBitWidth(llvm::Triple triple);
695695

@@ -762,6 +762,11 @@ namespace swift {
762762
llvm::SmallVector<std::pair<PlatformConditionKind, std::string>, 10>
763763
PlatformConditionValues;
764764
llvm::SmallVector<std::string, 2> CustomConditionalCompilationFlags;
765+
766+
/// The set of features that have been enabled. Doesn't include upcoming
767+
/// features, which are checked against the language version in
768+
/// `hasFeature`.
769+
FixedBitSet<numFeatures(), Feature> Features;
765770
};
766771

767772
class TypeCheckerOptions final {

lib/AST/ASTPrinter.cpp

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3876,12 +3876,12 @@ static bool usesFeatureTransferringArgsAndResults(Decl *decl) { return false; }
38763876
static void suppressingFeature(PrintOptions &options, Feature feature,
38773877
llvm::function_ref<void()> action) {
38783878
switch (feature) {
3879-
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
3880-
case Feature::FeatureName: \
3879+
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description) \
3880+
case Feature::FeatureName: \
38813881
llvm_unreachable("not a suppressible feature");
3882-
#define SUPPRESSIBLE_LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
3883-
case Feature::FeatureName: \
3884-
suppressingFeature##FeatureName(options, action); \
3882+
#define SUPPRESSIBLE_LANGUAGE_FEATURE(FeatureName, SENumber, Description) \
3883+
case Feature::FeatureName: \
3884+
suppressingFeature##FeatureName(options, action); \
38853885
return;
38863886
#include "swift/Basic/Features.def"
38873887
}
@@ -3952,12 +3952,12 @@ class FeatureSet {
39523952
void collectFeaturesUsed(Decl *decl, InsertOrRemove operation) {
39533953
// Go through each of the features, checking whether the
39543954
// declaration uses that feature.
3955-
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
3956-
if (usesFeature##FeatureName(decl)) \
3957-
collectRequiredFeature(Feature::FeatureName, operation);
3958-
#define SUPPRESSIBLE_LANGUAGE_FEATURE(FeatureName, SENumber, Description, Option) \
3959-
if (usesFeature##FeatureName(decl)) \
3960-
collectSuppressibleFeature(Feature::FeatureName, operation);
3955+
#define LANGUAGE_FEATURE(FeatureName, SENumber, Description) \
3956+
if (usesFeature##FeatureName(decl)) \
3957+
collectRequiredFeature(Feature::FeatureName, operation);
3958+
#define SUPPRESSIBLE_LANGUAGE_FEATURE(FeatureName, SENumber, Description) \
3959+
if (usesFeature##FeatureName(decl)) \
3960+
collectSuppressibleFeature(Feature::FeatureName, operation);
39613961
#include "swift/Basic/Features.def"
39623962
}
39633963
};

0 commit comments

Comments
 (0)