Skip to content

Commit e0d8e4f

Browse files
committed
[AST] Remove ParameterTypeFlags from ParenType and TupleType
The last clients that relied on stashing parameter type flags on these types are now gone.
1 parent 7ddefce commit e0d8e4f

24 files changed

+62
-266
lines changed

include/swift/AST/TypeMatcher.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,10 +125,10 @@ class TypeMatcher {
125125
const auto &firstElt = firstTuple->getElements()[i];
126126
const auto &secondElt = secondTuple->getElements()[i];
127127

128-
if (firstElt.getName() != secondElt.getName() ||
129-
firstElt.isVararg() != secondElt.isVararg())
128+
if (firstElt.getName() != secondElt.getName()) {
130129
return mismatch(firstTuple.getPointer(), secondTuple,
131130
sugaredFirstType);
131+
}
132132

133133
// Recurse on the tuple elements.
134134
if (!this->visit(firstTuple.getElementType(i), secondElt.getType(),

include/swift/AST/Types.h

Lines changed: 19 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -363,11 +363,7 @@ class alignas(1 << TypeAlignInBits) TypeBase
363363
HasCachedType : 1
364364
);
365365

366-
enum { NumFlagBits = 8 };
367-
SWIFT_INLINE_BITFIELD(ParenType, SugarType, NumFlagBits,
368-
/// Whether there is an original type.
369-
Flags : NumFlagBits
370-
);
366+
SWIFT_INLINE_BITFIELD_EMPTY(ParenType, SugarType);
371367

372368
SWIFT_INLINE_BITFIELD_FULL(AnyFunctionType, TypeBase, NumAFTExtInfoBits+1+1+1+16,
373369
/// Extra information which affects how the function is called, like
@@ -429,11 +425,7 @@ class alignas(1 << TypeAlignInBits) TypeBase
429425
ArgCount : 32
430426
);
431427

432-
SWIFT_INLINE_BITFIELD_FULL(TupleType, TypeBase, 1+32,
433-
/// Whether an element of the tuple is inout, __shared or __owned.
434-
/// Values cannot have such tuple types in the language.
435-
HasElementWithOwnership : 1,
436-
428+
SWIFT_INLINE_BITFIELD_FULL(TupleType, TypeBase, 32,
437429
: NumPadBits,
438430

439431
/// The number of elements of the tuple.
@@ -724,8 +716,8 @@ class alignas(1 << TypeAlignInBits) TypeBase
724716
return getRecursiveProperties().isLValue();
725717
}
726718

727-
/// Is this a first-class value type, meaning it is not an InOutType or a
728-
/// tuple type containing an InOutType?
719+
/// Is this a first-class value type, meaning it is not an LValueType or an
720+
/// InOutType.
729721
bool isMaterializable();
730722

731723
/// Is this a non-escaping type, that is, a non-escaping function type or a
@@ -1995,11 +1987,6 @@ class TypeAliasType final
19951987
}
19961988
};
19971989

1998-
// TODO: As part of AST modernization, replace with a proper
1999-
// 'ParameterTypeElt' or similar, and have FunctionTypes only have a list
2000-
// of 'ParameterTypeElt's. Then, this information can be removed from
2001-
// TupleTypeElt.
2002-
//
20031990
/// Provide parameter type relevant flags, i.e. variadic, autoclosure, and
20041991
/// escaping.
20051992
class ParameterTypeFlags {
@@ -2218,21 +2205,12 @@ class YieldTypeFlags {
22182205

22192206
/// ParenType - A paren type is a type that's been written in parentheses.
22202207
class ParenType : public SugarType {
2221-
friend class ASTContext;
2222-
2223-
ParenType(Type UnderlyingType, RecursiveTypeProperties properties,
2224-
ParameterTypeFlags flags);
2208+
ParenType(Type UnderlyingType, RecursiveTypeProperties properties);
22252209

22262210
public:
2227-
Type getUnderlyingType() const { return getSinglyDesugaredType(); }
2228-
2229-
static ParenType *get(const ASTContext &C, Type underlying,
2230-
ParameterTypeFlags flags = {});
2211+
static ParenType *get(const ASTContext &C, Type underlying);
22312212

2232-
/// Get the parameter flags
2233-
ParameterTypeFlags getParameterFlags() const {
2234-
return ParameterTypeFlags::fromRaw(Bits.ParenType.Flags);
2235-
}
2213+
Type getUnderlyingType() const { return getSinglyDesugaredType(); }
22362214

22372215
// Implement isa/cast/dyncast/etc.
22382216
static bool classof(const TypeBase *T) {
@@ -2248,37 +2226,17 @@ class TupleTypeElt {
22482226
/// This is the type of the field.
22492227
Type ElementType;
22502228

2251-
/// Flags that are specific to and relevant for parameter types
2252-
ParameterTypeFlags Flags;
2253-
22542229
friend class TupleType;
22552230

22562231
public:
22572232
TupleTypeElt() = default;
2258-
TupleTypeElt(Type ty, Identifier name = Identifier(),
2259-
ParameterTypeFlags fl = {});
2260-
2233+
TupleTypeElt(Type ty, Identifier name = Identifier());
2234+
22612235
bool hasName() const { return !Name.empty(); }
22622236
Identifier getName() const { return Name; }
2263-
2264-
Type getRawType() const { return ElementType; }
2265-
Type getType() const;
2266-
2267-
ParameterTypeFlags getParameterFlags() const { return Flags; }
22682237

2269-
/// Determine whether this field is variadic.
2270-
bool isVararg() const { return Flags.isVariadic(); }
2238+
Type getType() const { return ElementType; }
22712239

2272-
/// Determine whether this field is an autoclosure parameter closure.
2273-
bool isAutoClosure() const { return Flags.isAutoClosure(); }
2274-
2275-
/// Determine whether this field is marked 'inout'.
2276-
bool isInOut() const { return Flags.isInOut(); }
2277-
2278-
/// Remove the type of this varargs element designator, without the array
2279-
/// type wrapping it.
2280-
Type getVarargBaseTy() const;
2281-
22822240
/// Retrieve a copy of this tuple type element with the type replaced.
22832241
TupleTypeElt getWithType(Type T) const;
22842242

@@ -2340,11 +2298,6 @@ class TupleType final : public TypeBase, public llvm::FoldingSetNode,
23402298
/// getNamedElementId - If this tuple has an element with the specified name,
23412299
/// return the element index, otherwise return -1.
23422300
int getNamedElementId(Identifier I) const;
2343-
2344-
/// Returns true if this tuple has inout, __shared or __owned elements.
2345-
bool hasElementWithOwnership() const {
2346-
return static_cast<bool>(Bits.TupleType.HasElementWithOwnership);
2347-
}
23482301

23492302
// Implement isa/cast/dyncast/etc.
23502303
static bool classof(const TypeBase *T) {
@@ -2359,13 +2312,11 @@ class TupleType final : public TypeBase, public llvm::FoldingSetNode,
23592312

23602313
private:
23612314
TupleType(ArrayRef<TupleTypeElt> elements, const ASTContext *CanCtx,
2362-
RecursiveTypeProperties properties,
2363-
bool hasElementWithOwnership)
2364-
: TypeBase(TypeKind::Tuple, CanCtx, properties) {
2365-
Bits.TupleType.HasElementWithOwnership = hasElementWithOwnership;
2366-
Bits.TupleType.Count = elements.size();
2367-
std::uninitialized_copy(elements.begin(), elements.end(),
2368-
getTrailingObjects<TupleTypeElt>());
2315+
RecursiveTypeProperties properties)
2316+
: TypeBase(TypeKind::Tuple, CanCtx, properties) {
2317+
Bits.TupleType.Count = elements.size();
2318+
std::uninitialized_copy(elements.begin(), elements.end(),
2319+
getTrailingObjects<TupleTypeElt>());
23692320
}
23702321
};
23712322
BEGIN_CAN_TYPE_WRAPPER(TupleType, Type)
@@ -6554,17 +6505,9 @@ inline bool TypeBase::isTypeSequenceParameter() {
65546505
t->castTo<GenericTypeParamType>()->isTypeSequence();
65556506
}
65566507

6508+
// TODO: This will become redundant once InOutType is removed.
65576509
inline bool TypeBase::isMaterializable() {
6558-
if (hasLValueType())
6559-
return false;
6560-
6561-
if (is<InOutType>())
6562-
return false;
6563-
6564-
if (auto *TTy = getAs<TupleType>())
6565-
return !TTy->hasElementWithOwnership();
6566-
6567-
return true;
6510+
return !(hasLValueType() || is<InOutType>());
65686511
}
65696512

65706513
inline GenericTypeParamType *TypeBase::getRootGenericParam() {
@@ -6776,26 +6719,12 @@ inline bool CanType::isActuallyCanonicalOrNull() const {
67766719
getPointer()->isCanonical();
67776720
}
67786721

6779-
inline Type TupleTypeElt::getVarargBaseTy() const {
6780-
TypeBase *T = getType().getPointer();
6781-
if (auto *AT = dyn_cast<VariadicSequenceType>(T))
6782-
return AT->getBaseType();
6783-
if (auto *BGT = dyn_cast<BoundGenericType>(T)) {
6784-
// It's the stdlib Array<T>.
6785-
return BGT->getGenericArgs()[0];
6786-
}
6787-
assert(T->hasError());
6788-
return T;
6789-
}
6790-
67916722
inline TupleTypeElt TupleTypeElt::getWithName(Identifier name) const {
6792-
assert(getParameterFlags().isInOut() == getType()->is<InOutType>());
6793-
return TupleTypeElt(getRawType(), name, getParameterFlags());
6723+
return TupleTypeElt(getType(), name);
67946724
}
67956725

67966726
inline TupleTypeElt TupleTypeElt::getWithType(Type T) const {
6797-
auto flags = getParameterFlags().withInOut(T->is<InOutType>());
6798-
return TupleTypeElt(T->getInOutObjectType(), getName(), flags);
6727+
return TupleTypeElt(T, getName());
67996728
}
68006729

68016730
/// Create one from what's present in the parameter decl and type

lib/AST/ASTContext.cpp

Lines changed: 13 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,7 @@ struct ASTContext::Implementation {
397397
llvm::DenseMap<Type, VariadicSequenceType*> VariadicSequenceTypes;
398398
llvm::DenseMap<std::pair<Type, Type>, DictionaryType *> DictionaryTypes;
399399
llvm::DenseMap<Type, OptionalType*> OptionalTypes;
400-
llvm::DenseMap<Type, ParenType*> SimpleParenTypes; // Most are simple
401-
llvm::DenseMap<std::pair<Type, unsigned>, ParenType*> ParenTypes;
400+
llvm::DenseMap<Type, ParenType*> ParenTypes;
402401
llvm::DenseMap<uintptr_t, ReferenceStorageType*> ReferenceStorageTypes;
403402
llvm::DenseMap<Type, LValueType*> LValueTypes;
404403
llvm::DenseMap<Type, InOutType*> InOutTypes;
@@ -2626,7 +2625,6 @@ size_t ASTContext::Implementation::Arena::getTotalMemory() const {
26262625
llvm::capacity_in_bytes(DictionaryTypes) +
26272626
llvm::capacity_in_bytes(OptionalTypes) +
26282627
llvm::capacity_in_bytes(VariadicSequenceTypes) +
2629-
llvm::capacity_in_bytes(SimpleParenTypes) +
26302628
llvm::capacity_in_bytes(ParenTypes) +
26312629
llvm::capacity_in_bytes(ReferenceStorageTypes) +
26322630
llvm::capacity_in_bytes(LValueTypes) +
@@ -2836,22 +2834,14 @@ BuiltinVectorType *BuiltinVectorType::get(const ASTContext &context,
28362834
return vecTy;
28372835
}
28382836

2839-
ParenType *ParenType::get(const ASTContext &C, Type underlying,
2840-
ParameterTypeFlags fl) {
2841-
if (fl.isInOut())
2842-
assert(!underlying->is<InOutType>() && "caller did not pass a base type");
2843-
if (underlying->is<InOutType>())
2844-
assert(fl.isInOut() && "caller did not set flags correctly");
2845-
2837+
ParenType *ParenType::get(const ASTContext &C, Type underlying) {
28462838
auto properties = underlying->getRecursiveProperties();
28472839
auto arena = getArena(properties);
2848-
auto flags = fl.toRaw();
2849-
ParenType *&Result = flags == 0
2850-
? C.getImpl().getArena(arena).SimpleParenTypes[underlying]
2851-
: C.getImpl().getArena(arena).ParenTypes[{underlying, flags}];
2840+
ParenType *&Result = C.getImpl().getArena(arena).ParenTypes[underlying];
28522841
if (Result == nullptr) {
2853-
Result = new (C, arena) ParenType(underlying,
2854-
properties, fl);
2842+
Result = new (C, arena) ParenType(underlying, properties);
2843+
assert((C.hadError() || !underlying->is<InOutType>()) &&
2844+
"Cannot wrap InOutType");
28552845
}
28562846
return Result;
28572847
}
@@ -2866,35 +2856,19 @@ void TupleType::Profile(llvm::FoldingSetNodeID &ID,
28662856
for (const TupleTypeElt &Elt : Fields) {
28672857
ID.AddPointer(Elt.Name.get());
28682858
ID.AddPointer(Elt.getType().getPointer());
2869-
ID.AddInteger(Elt.Flags.toRaw());
28702859
}
28712860
}
28722861

28732862
/// getTupleType - Return the uniqued tuple type with the specified elements.
28742863
Type TupleType::get(ArrayRef<TupleTypeElt> Fields, const ASTContext &C) {
2875-
if (Fields.size() == 1 && !Fields[0].isVararg() && !Fields[0].hasName())
2876-
return ParenType::get(C, Fields[0].getRawType(),
2877-
Fields[0].getParameterFlags());
2864+
if (Fields.size() == 1 && !Fields[0].hasName())
2865+
return ParenType::get(C, Fields[0].getType());
28782866

28792867
RecursiveTypeProperties properties;
2880-
bool hasElementWithOwnership = false;
28812868
for (const TupleTypeElt &Elt : Fields) {
28822869
auto eltTy = Elt.getType();
28832870
if (!eltTy) continue;
2884-
28852871
properties |= eltTy->getRecursiveProperties();
2886-
// Recur into paren types and canonicalized paren types. 'inout' in nested
2887-
// non-paren tuples are malformed and will be diagnosed later.
2888-
if (auto *TTy = Elt.getType()->getAs<TupleType>()) {
2889-
if (TTy->getNumElements() == 1)
2890-
hasElementWithOwnership |= TTy->hasElementWithOwnership();
2891-
} else if (auto *Pty = dyn_cast<ParenType>(Elt.getType().getPointer())) {
2892-
hasElementWithOwnership |= (Pty->getParameterFlags().getValueOwnership() !=
2893-
ValueOwnership::Default);
2894-
} else {
2895-
hasElementWithOwnership |= (Elt.getParameterFlags().getValueOwnership() !=
2896-
ValueOwnership::Default);
2897-
}
28982872
}
28992873

29002874
auto arena = getArena(properties);
@@ -2919,24 +2893,15 @@ Type TupleType::get(ArrayRef<TupleTypeElt> Fields, const ASTContext &C) {
29192893
size_t bytes = totalSizeToAlloc<TupleTypeElt>(Fields.size());
29202894
// TupleType will copy the fields list into ASTContext owned memory.
29212895
void *mem = C.Allocate(bytes, alignof(TupleType), arena);
2922-
auto New = new (mem) TupleType(Fields, IsCanonical ? &C : nullptr, properties,
2923-
hasElementWithOwnership);
2896+
auto New = new (mem) TupleType(Fields, IsCanonical ? &C : nullptr,
2897+
properties);
29242898
C.getImpl().getArena(arena).TupleTypes.InsertNode(New, InsertPos);
29252899
return New;
29262900
}
29272901

2928-
TupleTypeElt::TupleTypeElt(Type ty, Identifier name,
2929-
ParameterTypeFlags fl)
2930-
: Name(name), ElementType(ty), Flags(fl) {
2931-
if (fl.isInOut())
2932-
assert(!ty->is<InOutType>() && "caller did not pass a base type");
2933-
if (ty->is<InOutType>())
2934-
assert(fl.isInOut() && "caller did not set flags correctly");
2935-
}
2936-
2937-
Type TupleTypeElt::getType() const {
2938-
if (Flags.isInOut()) return InOutType::get(ElementType);
2939-
return ElementType;
2902+
TupleTypeElt::TupleTypeElt(Type ty, Identifier name)
2903+
: Name(name), ElementType(ty) {
2904+
assert(!ty->is<InOutType>() && "Cannot have InOutType in a tuple");
29402905
}
29412906

29422907
PackExpansionType *PackExpansionType::get(Type patternTy) {

lib/AST/ASTDumper.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3649,7 +3649,6 @@ namespace {
36493649

36503650
void visitParenType(ParenType *T, StringRef label) {
36513651
printCommon(label, "paren_type");
3652-
dumpParameterFlags(T->getParameterFlags());
36533652
printRec(T->getUnderlyingType());
36543653
PrintWithColorRAII(OS, ParenthesisColor) << ')';
36553654
}
@@ -3664,7 +3663,6 @@ namespace {
36643663
PrintWithColorRAII(OS, TypeFieldColor) << "tuple_type_elt";
36653664
if (elt.hasName())
36663665
printField("name", elt.getName().str());
3667-
dumpParameterFlags(elt.getParameterFlags());
36683666
printRec(elt.getType());
36693667
OS << ")";
36703668
}

lib/AST/ASTMangler.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2749,8 +2749,7 @@ void ASTMangler::appendTypeList(Type listTy, GenericSignature sig,
27492749
return appendOperator("y");
27502750
bool firstField = true;
27512751
for (auto &field : tuple->getElements()) {
2752-
assert(field.getParameterFlags().isNone());
2753-
appendTypeListElement(field.getName(), field.getRawType(),
2752+
appendTypeListElement(field.getName(), field.getType(),
27542753
ParameterTypeFlags(),
27552754
sig, forDecl);
27562755
appendListSeparator(firstField);

lib/AST/ASTPrinter.cpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5498,8 +5498,6 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
54985498

54995499
void visitParenType(ParenType *T) {
55005500
Printer << "(";
5501-
printParameterFlags(Printer, Options, T->getParameterFlags(),
5502-
/*escaping*/ false);
55035501
visit(T->getUnderlyingType()->getInOutObjectType());
55045502
Printer << ")";
55055503
}
@@ -5534,7 +5532,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
55345532
if (i)
55355533
Printer << ", ";
55365534
const TupleTypeElt &TD = Fields[i];
5537-
Type EltType = TD.getRawType();
5535+
Type EltType = TD.getType();
55385536

55395537
Printer.callPrintStructurePre(PrintStructureKind::TupleElement);
55405538
SWIFT_DEFER {
@@ -5545,14 +5543,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
55455543
Printer.printName(TD.getName(), PrintNameContext::TupleElement);
55465544
Printer << ": ";
55475545
}
5548-
if (TD.isVararg()) {
5549-
visit(TD.getVarargBaseTy());
5550-
Printer << "...";
5551-
} else {
5552-
printParameterFlags(Printer, Options, TD.getParameterFlags(),
5553-
/*escaping*/ false);
5554-
visit(EltType);
5555-
}
5546+
visit(EltType);
55565547
}
55575548
Printer << ")";
55585549
}

0 commit comments

Comments
 (0)