@@ -290,10 +290,9 @@ class alignas(8) Expr {
290290
291291 SWIFT_INLINE_BITFIELD_EMPTY (ImplicitConversionExpr, Expr);
292292
293- SWIFT_INLINE_BITFIELD_FULL (TupleShuffleExpr, ImplicitConversionExpr, 16 ,
294- // / This contains an entry for each element in the Expr type. Each element
295- // / specifies which index from the SubExpr that the destination element gets.
296- NumElementMappings : 16
293+ SWIFT_INLINE_BITFIELD_FULL (DestructureTupleExpr, ImplicitConversionExpr, 16 ,
294+ // / The number of elements in the tuple type being destructured.
295+ NumElements : 16
297296 );
298297
299298 SWIFT_INLINE_BITFIELD_FULL (ArgumentShuffleExpr, ImplicitConversionExpr, 2 +16 +16 +16 ,
@@ -2960,37 +2959,53 @@ class UnevaluatedInstanceExpr : public ImplicitConversionExpr {
29602959 }
29612960};
29622961
2963- // / TupleShuffleExpr - This represents a permutation of a tuple value to a new
2964- // / tuple type.
2965- class TupleShuffleExpr final : public ImplicitConversionExpr,
2966- private llvm::TrailingObjects<TupleShuffleExpr, unsigned > {
2962+ // / DestructureTupleExpr - Destructure a tuple value produced by a source
2963+ // / expression, binding the elements to OpaqueValueExprs, then evaluate the
2964+ // / result expression written in terms of the OpaqueValueExprs.
2965+ class DestructureTupleExpr final : public ImplicitConversionExpr,
2966+ private llvm::TrailingObjects<DestructureTupleExpr, OpaqueValueExpr *> {
29672967 friend TrailingObjects;
29682968
2969- size_t numTrailingObjects (OverloadToken<unsigned >) const {
2970- return Bits.TupleShuffleExpr . NumElementMappings ;
2969+ size_t numTrailingObjects (OverloadToken<OpaqueValueExpr * >) const {
2970+ return Bits.DestructureTupleExpr . NumElements ;
29712971 }
29722972
29732973private:
2974- TupleShuffleExpr (Expr *subExpr, ArrayRef<unsigned > elementMapping,
2975- Type ty)
2976- : ImplicitConversionExpr(ExprKind::TupleShuffle, subExpr, ty) {
2977- Bits.TupleShuffleExpr .NumElementMappings = elementMapping.size ();
2978- std::uninitialized_copy (elementMapping.begin (), elementMapping.end (),
2979- getTrailingObjects<unsigned >());
2974+ Expr *DstExpr;
2975+
2976+ DestructureTupleExpr (ArrayRef<OpaqueValueExpr *> destructuredElements,
2977+ Expr *srcExpr, Expr *dstExpr, Type ty)
2978+ : ImplicitConversionExpr(ExprKind::DestructureTuple, srcExpr, ty),
2979+ DstExpr (dstExpr) {
2980+ Bits.DestructureTupleExpr .NumElements = destructuredElements.size ();
2981+ std::uninitialized_copy (destructuredElements.begin (),
2982+ destructuredElements.end (),
2983+ getTrailingObjects<OpaqueValueExpr *>());
29802984 }
29812985
29822986public:
2983- static TupleShuffleExpr *create (ASTContext &ctx, Expr *subExpr,
2984- ArrayRef<unsigned > elementMapping,
2985- Type ty);
2987+ // / Create a tuple destructuring. The type of srcExpr must be a tuple type,
2988+ // / and the number of elements must equal the size of destructureElements.
2989+ static DestructureTupleExpr *
2990+ create (ASTContext &ctx,
2991+ ArrayRef<OpaqueValueExpr *> destructuredElements,
2992+ Expr *srcExpr, Expr *dstExpr, Type ty);
29862993
2987- ArrayRef<unsigned > getElementMapping () const {
2988- return {getTrailingObjects<unsigned >(),
2989- static_cast <size_t >(Bits.TupleShuffleExpr .NumElementMappings )};
2994+ ArrayRef<OpaqueValueExpr *> getDestructuredElements () const {
2995+ return {getTrailingObjects<OpaqueValueExpr *>(),
2996+ static_cast <size_t >(Bits.DestructureTupleExpr .NumElements )};
2997+ }
2998+
2999+ Expr *getResultExpr () const {
3000+ return DstExpr;
3001+ }
3002+
3003+ void setResultExpr (Expr *dstExpr) {
3004+ DstExpr = dstExpr;
29903005 }
29913006
29923007 static bool classof (const Expr *E) {
2993- return E->getKind () == ExprKind::TupleShuffle ;
3008+ return E->getKind () == ExprKind::DestructureTuple ;
29943009 }
29953010};
29963011
0 commit comments