Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/Expression.cc	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Apr 14 13:02:28 2016
-// Update Count     : 34
+// Last Modified On : Thu Apr 14 15:33:12 2016
+// Update Count     : 40
 //
 
@@ -22,4 +22,5 @@
 
 #include "Type.h"
+#include "Initializer.h"
 #include "Expression.h"
 #include "Declaration.h"
@@ -213,4 +214,25 @@
 
 	os << " of ";
+
+	if ( type ) {
+		type->print(os, indent + 2);
+	} else {
+		os << "<NULL>";
+	}
+
+	os << std::endl;
+	Expression::print( os, indent );
+}
+
+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 ) {
@@ -478,4 +500,21 @@
 
 
+CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
+	add_result( type->clone() );
+}
+
+CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}
+
+CompoundLiteralExpr::~CompoundLiteralExpr() {
+	delete initializer;
+	delete type;
+}
+
+void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {
+	os << "Compound Literal Expression: " << std::endl;
+	if ( type ) type->print( os, indent + 2 );
+	if ( initializer ) initializer->print( os, indent + 2 );
+}
+
 
 std::ostream & operator<<( std::ostream & out, Expression * expr ) {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/Expression.h	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Thu Apr 14 12:04:58 2016
-// Update Count     : 19
+// Last Modified On : Thu Apr 14 15:40:56 2016
+// Update Count     : 21
 //
 
@@ -363,4 +363,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 {
@@ -593,4 +613,26 @@
 };
 
+/// CompoundLiteralExpr represents a C99 'compound literal'
+class CompoundLiteralExpr : public Expression {
+  public:
+	CompoundLiteralExpr( Type * type, Initializer * initializer );
+	CompoundLiteralExpr( const CompoundLiteralExpr &other );
+	~CompoundLiteralExpr();
+
+	Type * get_type() const { return type; }
+	void set_type( Type * t ) { type = t; }
+
+	Initializer * get_initializer() const { return initializer; }
+	void set_initializer( Initializer * i ) { initializer = i; }
+
+	virtual CompoundLiteralExpr *clone() const { return new CompoundLiteralExpr( *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:
+	Type * type;
+	Initializer * initializer;
+};
+
 std::ostream & operator<<( std::ostream & out, Expression * expr );
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/Mutator.cc	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri Apr 08 14:01:47 2016
-// Update Count     : 15
+// Last Modified On : Thu Apr 14 15:32:19 2016
+// Update Count     : 16
 //
 
@@ -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 );
@@ -341,4 +347,11 @@
 	mutateAll( valofExpr->get_results(), *this );
 	return valofExpr;
+}
+
+Expression *Mutator::mutate( CompoundLiteralExpr *compLitExpr ) {
+	mutateAll( compLitExpr->get_results(), *this );
+	compLitExpr->set_type( maybeMutate( compLitExpr->get_type(), *this ) );
+	compLitExpr->set_initializer( maybeMutate( compLitExpr->get_initializer(), *this ) );
+	return compLitExpr;
 }
 
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/Mutator.h	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri Apr 08 13:22:04 2016
-// Update Count     : 9
+// Last Modified On : Thu Apr 14 15:32:00 2016
+// Update Count     : 10
 //
 #include <cassert>
@@ -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 );
@@ -77,4 +78,5 @@
 	virtual Expression* mutate( ImplicitCopyCtorExpr *impCpCtorExpr );
 	virtual Expression* mutate( UntypedValofExpr *valofExpr );
+	virtual Expression* mutate( CompoundLiteralExpr *compLitExpr );
 
 	virtual Type* mutate( VoidType *basicType );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/SynTree.h	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri Apr 08 13:49:47 2016
-// Update Count     : 4
+// Last Modified On : Thu Apr 14 15:31:36 2016
+// Update Count     : 5
 //
 
@@ -72,4 +72,5 @@
 class UntypedOffsetofExpr;
 class OffsetofExpr;
+class OffsetPackExpr;
 class AttrExpr;
 class LogicalExpr;
@@ -82,4 +83,5 @@
 class ImplicitCopyCtorExpr;
 class UntypedValofExpr;
+class CompoundLiteralExpr;
 
 class Type;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/Visitor.cc	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,5 +10,5 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri Apr 08 13:53:21 2016
+// Last Modified On : Thu Apr 14 15:31:18 2016
 // Update Count     : 18
 //
@@ -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 );
@@ -288,4 +293,10 @@
 	acceptAll( valofExpr->get_results(), *this );
 	maybeAccept( valofExpr->get_body(), *this );
+}
+
+void Visitor::visit( CompoundLiteralExpr *compLitExpr ) {
+	acceptAll( compLitExpr->get_results(), *this );
+	maybeAccept( compLitExpr->get_type(), *this );
+	maybeAccept( compLitExpr->get_initializer(), *this );
 }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision db4ecc5dc5f63e878081bdb8834e09944e3d08b7)
+++ src/SynTree/Visitor.h	(revision 356189ae6aa5eeb5c37aa8f28f8cff067fb2f919)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Rob Schluntz
-// Last Modified On : Fri Apr 08 13:26:31 2016
-// Update Count     : 6
+// Last Modified On : Thu Apr 14 15:30:58 2016
+// Update Count     : 7
 //
 
@@ -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 );
@@ -77,4 +78,5 @@
 	virtual void visit( ImplicitCopyCtorExpr *impCpCtorExpr );
 	virtual void visit( UntypedValofExpr *valofExpr );
+	virtual void visit( CompoundLiteralExpr *compLitExpr );
 
 	virtual void visit( VoidType *basicType );
