Skip to content

Commit 3b015dd

Browse files
committed
[AST] Flag to indicate a FunctionConversionExpr flattens the type
1 parent 5d55dc1 commit 3b015dd

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

include/swift/AST/Expr.h

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -360,6 +360,14 @@ class alignas(8) Expr {
360360
< (1 << NumCheckedCastKindBits),
361361
"unable to fit a CheckedCastKind in the given number of bits");
362362

363+
class FunctionConversionExprBitfields {
364+
friend class FunctionConversionExpr;
365+
unsigned : NumImplicitConversionExprBits;
366+
unsigned Flattening : 1;
367+
};
368+
enum { NumFunctionConversionExprBits = NumImplicitConversionExprBits + 1 };
369+
static_assert(NumFunctionConversionExprBits <= 32, "fits in an unsigned");
370+
363371
class CollectionUpcastConversionExprBitfields {
364372
friend class CollectionUpcastConversionExpr;
365373
unsigned : NumExprBits;
@@ -413,6 +421,7 @@ class alignas(8) Expr {
413421
ApplyExprBitfields ApplyExprBits;
414422
CallExprBitfields CallExprBits;
415423
CheckedCastExprBitfields CheckedCastExprBits;
424+
FunctionConversionExprBitfields FunctionConversionExprBits;
416425
CollectionUpcastConversionExprBitfields CollectionUpcastConversionExprBits;
417426
TupleShuffleExprBitfields TupleShuffleExprBits;
418427
ObjCSelectorExprBitfields ObjCSelectorExprBits;
@@ -2761,8 +2770,22 @@ class UnresolvedTypeConversionExpr : public ImplicitConversionExpr {
27612770
class FunctionConversionExpr : public ImplicitConversionExpr {
27622771
public:
27632772
FunctionConversionExpr(Expr *subExpr, Type type)
2764-
: ImplicitConversionExpr(ExprKind::FunctionConversion, subExpr, type) {}
2765-
2773+
: ImplicitConversionExpr(ExprKind::FunctionConversion, subExpr, type) {
2774+
FunctionConversionExprBits.Flattening = false;
2775+
}
2776+
2777+
/// Set whether this function conversion flattens an unapplied member
2778+
/// function.
2779+
void setFlattening() {
2780+
FunctionConversionExprBits.Flattening = true;
2781+
}
2782+
2783+
/// Returns whether this function conversion flattens an unapplied member
2784+
/// function.
2785+
bool isFlattening() const {
2786+
return FunctionConversionExprBits.Flattening;
2787+
}
2788+
27662789
static bool classof(const Expr *E) {
27672790
return E->getKind() == ExprKind::FunctionConversion;
27682791
}

lib/AST/ASTDumper.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1897,7 +1897,10 @@ class PrintExpr : public ExprVisitor<PrintExpr> {
18971897
OS << ')';
18981898
}
18991899
void visitFunctionConversionExpr(FunctionConversionExpr *E) {
1900-
printCommon(E, "function_conversion_expr") << '\n';
1900+
printCommon(E, "function_conversion_expr");
1901+
if (E->isFlattening())
1902+
OS << " flattening";
1903+
OS << '\n';
19011904
printRec(E->getSubExpr());
19021905
OS << ')';
19031906
}

0 commit comments

Comments
 (0)