Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision b1e63ac54a1b3b3705d130858c9772e8b84c867f)
+++ src/SynTree/Expression.cc	(revision 0698aa1b5a7ea80416468a0bda92dba61d09df20)
@@ -335,5 +335,7 @@
 namespace {
 	TypeSubstitution makeSub( Type * t ) {
-		if ( StructInstType * aggInst = dynamic_cast< StructInstType * >( t ) ) {
+		if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( t ) ) {
+			return makeSub( refType->get_base() );
+		} else if ( StructInstType * aggInst = dynamic_cast< StructInstType * >( t ) ) {
 			return TypeSubstitution( aggInst->get_baseParameters()->begin(), aggInst->get_baseParameters()->end(), aggInst->get_parameters().begin() );
 		} else if ( UnionInstType * aggInst = dynamic_cast< UnionInstType * >( t ) ) {
@@ -400,9 +402,6 @@
 	if ( Type * type = expr->get_result() ) {
 		Type * base = InitTweak::getPointerBase( type );
-		if ( ! base ) {
-			std::cerr << type << std::endl;
-		}
-		assertf( base, "expected pointer type in dereference\n" );
-		ret->set_result( maybeClone( base ) );
+		assertf( base, "expected pointer type in dereference (type was %s)", toString( type ).c_str() );
+		ret->set_result( new ReferenceType( Type::Qualifiers(), base->clone() ) );
 	}
 	return ret;
Index: src/SynTree/Type.cc
===================================================================
--- src/SynTree/Type.cc	(revision b1e63ac54a1b3b3705d130858c9772e8b84c867f)
+++ src/SynTree/Type.cc	(revision 0698aa1b5a7ea80416468a0bda92dba61d09df20)
@@ -65,8 +65,16 @@
 const char * Type::QualifiersNames[] = { "const", "restrict", "volatile", "lvalue", "mutex", "_Atomic" };
 
-Type *Type::stripDeclarator() {
+Type * Type::stripDeclarator() {
 	Type * type = this;
 	while ( Type * at = InitTweak::getPointerBase( type ) ) {
 		type = at;
+	}
+	return type;
+}
+
+Type * Type::stripReferences() {
+	Type * type = this;
+	while ( ReferenceType * ref = dynamic_cast<ReferenceType *>( type ) ) {
+		type = ref->get_base();
 	}
 	return type;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision b1e63ac54a1b3b3705d130858c9772e8b84c867f)
+++ src/SynTree/Type.h	(revision 0698aa1b5a7ea80416468a0bda92dba61d09df20)
@@ -158,5 +158,8 @@
 
 	/// return type without outer pointers and arrays
-	Type *stripDeclarator();
+	Type * stripDeclarator();
+
+	/// return type without outer references
+	Type * stripReferences();
 
 	virtual bool isComplete() const { return true; }
