Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/Expression.cc	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -163,4 +163,29 @@
 }
 
+UntypedOffsetofExpr::UntypedOffsetofExpr( Type *type_, const std::string &member_, Expression *_aname ) :
+		Expression( _aname ), type(type_), member(member_) {
+	add_result( new BasicType( Type::Qualifiers(), BasicType::LongUnsignedInt ) );
+}
+
+UntypedOffsetofExpr::UntypedOffsetofExpr( const UntypedOffsetofExpr &other ) :
+	Expression( other ), type( maybeClone( other.type ) ), member( other.member ) {}
+
+UntypedOffsetofExpr::~UntypedOffsetofExpr() {
+	delete type;
+}
+
+void UntypedOffsetofExpr::print( std::ostream &os, int indent) const {
+	os << std::string( indent, ' ' ) << "Untyped Offsetof Expression on member " << member << " of ";
+
+	if ( type ) {
+		type->print(os, indent + 2);
+	} else {
+		os << "<NULL>";
+	}
+
+	os << std::endl;
+	Expression::print( os, indent );
+}
+
 OffsetofExpr::OffsetofExpr( Type *type_, DeclarationWithType *member_, Expression *_aname ) :
 		Expression( _aname ), type(type_), member(member_) {
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/Expression.h	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -319,4 +319,25 @@
 };
 
+/// UntypedOffsetofExpr represents an offsetof expression before resolution
+class UntypedOffsetofExpr : public Expression {
+  public:
+	UntypedOffsetofExpr( Type *type, const std::string &member, Expression *_aname = 0 );
+	UntypedOffsetofExpr( const UntypedOffsetofExpr &other );
+	virtual ~UntypedOffsetofExpr();
+
+	std::string get_member() const { return member; }
+	void set_member( const std::string &newValue ) { member = newValue; }
+	Type *get_type() const { return type; }
+	void set_type( Type *newValue ) { type = newValue; }
+
+	virtual UntypedOffsetofExpr *clone() const { return new UntypedOffsetofExpr( *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;
+	std::string member;
+};
+
 /// OffsetofExpr represents an offsetof expression
 class OffsetofExpr : public Expression {
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/Mutator.cc	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -261,4 +261,10 @@
 }
 
+Expression *Mutator::mutate( UntypedOffsetofExpr *offsetofExpr ) {
+	mutateAll( offsetofExpr->get_results(), *this );
+	offsetofExpr->set_type( maybeMutate( offsetofExpr->get_type(), *this ) );
+	return offsetofExpr;
+}
+
 Expression *Mutator::mutate( OffsetofExpr *offsetofExpr ) {
 	mutateAll( offsetofExpr->get_results(), *this );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/Mutator.h	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -65,4 +65,5 @@
 	virtual Expression* mutate( SizeofExpr *sizeofExpr );
 	virtual Expression* mutate( AlignofExpr *alignofExpr );
+	virtual Expression* mutate( UntypedOffsetofExpr *offsetofExpr );
 	virtual Expression* mutate( OffsetofExpr *offsetofExpr );
 	virtual Expression* mutate( AttrExpr *attrExpr );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/SynTree.h	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -70,4 +70,5 @@
 class SizeofExpr;
 class AlignofExpr;
+class UntypedOffsetofExpr;
 class OffsetofExpr;
 class AttrExpr;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/Visitor.cc	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -219,4 +219,9 @@
 }
 
+void Visitor::visit( UntypedOffsetofExpr *offsetofExpr ) {
+	acceptAll( offsetofExpr->get_results(), *this );
+	maybeAccept( offsetofExpr->get_type(), *this );
+}
+
 void Visitor::visit( OffsetofExpr *offsetofExpr ) {
 	acceptAll( offsetofExpr->get_results(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision ae8b94256813adfe7582e0fabf10bdd0d8c7b864)
+++ src/SynTree/Visitor.h	(revision ae7f1e091b3ca8bf1fd175be398b5a9629c2eea8)
@@ -65,4 +65,5 @@
 	virtual void visit( SizeofExpr *sizeofExpr );
 	virtual void visit( AlignofExpr *alignofExpr );
+	virtual void visit( UntypedOffsetofExpr *offsetofExpr );
 	virtual void visit( OffsetofExpr *offsetofExpr );
 	virtual void visit( AttrExpr *attrExpr );
