Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/Expression.cc	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -223,4 +223,25 @@
 }
 
+OffsetPackExpr::OffsetPackExpr( StructInstType *type_, Expression *aname_ ) : Expression( aname_ ), type( type_ ) {
+	add_result( new ArrayType( Type::Qualifiers(), new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ), 0, false, false ) );
+}
+
+OffsetPackExpr::OffsetPackExpr( const OffsetPackExpr &other ) : Expression( other ), type( maybeClone( other.type ) ) {}
+
+OffsetPackExpr::~OffsetPackExpr() { delete type; }
+
+void OffsetPackExpr::print( std::ostream &os, int indent ) const {
+	os << std::string( indent, ' ' ) << "Offset pack expression on ";
+
+	if ( type ) {
+		type->print(os, indent + 2);
+	} else {
+		os << "<NULL>";
+	}
+
+	os << std::endl;
+	Expression::print( os, indent );
+}
+
 AttrExpr::AttrExpr( Expression *attr, Expression *expr_, Expression *_aname ) :
 		Expression( _aname ), attr( attr ), expr(expr_), type(0), isType(false) {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/Expression.h	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -362,4 +362,24 @@
 };
 
+/// Expression representing a pack of field-offsets for a generic type
+class OffsetPackExpr : public Expression {
+public:
+	OffsetPackExpr( StructInstType *type_, Expression *aname_ = 0 );
+	OffsetPackExpr( const OffsetPackExpr &other );
+	virtual ~OffsetPackExpr();
+
+	StructInstType *get_type() const { return type; }
+	void set_type( StructInstType *newValue ) { type = newValue; }
+
+	virtual OffsetPackExpr *clone() const { return new OffsetPackExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+
+private:
+	StructInstType *type;
+};
+
 /// AttrExpr represents an @attribute expression (like sizeof, but user-defined)
 class AttrExpr : public Expression {
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/Mutator.cc	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -274,4 +274,10 @@
 }
 
+Expression *Mutator::mutate( OffsetPackExpr *offsetPackExpr ) {
+	mutateAll( offsetPackExpr->get_results(), *this );
+	offsetPackExpr->set_type( maybeMutate( offsetPackExpr->get_type(), *this ) );
+	return offsetPackExpr;
+}
+
 Expression *Mutator::mutate( AttrExpr *attrExpr ) {
 	mutateAll( attrExpr->get_results(), *this );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/Mutator.h	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -67,4 +67,5 @@
 	virtual Expression* mutate( UntypedOffsetofExpr *offsetofExpr );
 	virtual Expression* mutate( OffsetofExpr *offsetofExpr );
+	virtual Expression* mutate( OffsetPackExpr *offsetPackExpr );
 	virtual Expression* mutate( AttrExpr *attrExpr );
 	virtual Expression* mutate( LogicalExpr *logicalExpr );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/SynTree.h	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -72,4 +72,5 @@
 class UntypedOffsetofExpr;
 class OffsetofExpr;
+class OffsetPackExpr;
 class AttrExpr;
 class LogicalExpr;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/Visitor.cc	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -230,4 +230,9 @@
 }
 
+void Visitor::visit( OffsetPackExpr *offsetPackExpr ) {
+	acceptAll( offsetPackExpr->get_results(), *this );
+	maybeAccept( offsetPackExpr->get_type(), *this );
+}
+
 void Visitor::visit( AttrExpr *attrExpr ) {
 	acceptAll( attrExpr->get_results(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 630a82a5214317b27ab087ea8d7665b217527f07)
+++ src/SynTree/Visitor.h	(revision 7b9375750bf2f89700a27d7fd3cef79bbc71ef92)
@@ -67,4 +67,5 @@
 	virtual void visit( UntypedOffsetofExpr *offsetofExpr );
 	virtual void visit( OffsetofExpr *offsetofExpr );
+	virtual void visit( OffsetPackExpr *offsetPackExpr );
 	virtual void visit( AttrExpr *attrExpr );
 	virtual void visit( LogicalExpr *logicalExpr );
