Index: src/AST/Expr.cpp
===================================================================
--- src/AST/Expr.cpp	(revision d3d54b3f6c6e72820dcc274dd66a67aa194b7ded)
+++ src/AST/Expr.cpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
@@ -281,21 +281,30 @@
 // --- SizeofExpr
 
-SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * t )
-: Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
+SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type )
+: SizeofExpr( loc, type, nullptr ) {}
+
+SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * type, const Type * result )
+: Expr( loc, result ), type( type ) {}
 
 // --- AlignofExpr
 
-AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t )
-: Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
+AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type )
+: AlignofExpr( loc, type, nullptr ) {}
+
+AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * type, const Type * result )
+: Expr( loc, result ), type( type ) {}
 
 // --- CountofExpr
 
 CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t )
-: Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
+: Expr( loc ), type( t ) {}
 
 // --- OffsetofExpr
 
 OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem )
-: Expr( loc, ast::TranslationDeps::getSizeType() ), type( ty ), member( mem ) {
+: OffsetofExpr( loc, ty, mem, nullptr ) {}
+
+OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res )
+: Expr( loc, res ), type( ty ), member( mem ) {
 	assert( type );
 	assert( member );
@@ -305,7 +314,5 @@
 
 OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty )
-: Expr( loc, new ArrayType{
-	ast::TranslationDeps::getSizeType(), nullptr, FixedLen, DynamicDim }
-), type( ty ) {
+: Expr( loc ), type( ty ) {
 	assert( type );
 }
Index: src/AST/Expr.hpp
===================================================================
--- src/AST/Expr.hpp	(revision d3d54b3f6c6e72820dcc274dd66a67aa194b7ded)
+++ src/AST/Expr.hpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
@@ -483,4 +483,5 @@
 
 	SizeofExpr( const CodeLocation & loc, const Type * t );
+	SizeofExpr( const CodeLocation & loc, const Type * t, const Type * r );
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
@@ -496,4 +497,5 @@
 
 	AlignofExpr( const CodeLocation & loc, const Type * t );
+	AlignofExpr( const CodeLocation & loc, const Type * t, const Type * r );
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
@@ -538,4 +540,5 @@
 
 	OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem );
+	OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem, const Type * res );
 
 	const Expr * accept( Visitor & v ) const override { return v.visit( this ); }
Index: src/AST/Util.cpp
===================================================================
--- src/AST/Util.cpp	(revision d3d54b3f6c6e72820dcc274dd66a67aa194b7ded)
+++ src/AST/Util.cpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
@@ -384,30 +384,3 @@
 }
 
-namespace {
-	const TranslationUnit * transUnit = 0;
-}
-
-void TranslationDeps::evolve( TranslationUnit & u ) {
-	transUnit = &u;
-}
-
-const ast::Type * TranslationDeps::getSizeType() {
-	static const ast::Type * zd_abstract = new TypeInstType{ "size_t", TypeDecl::Kind::Dtype };
-	static const ast::Type * ld_concrete = new BasicType( BasicKind::LongUnsignedInt );
-	if ( ! transUnit ) {
-		// early state
-		// as if `size_t` in program text were freshly parsed
-		return zd_abstract;
-	} else if ( transUnit->global.sizeType ) {
-		// late state, normal run
-		// whatever size_t was defined as
-		return transUnit->global.sizeType;
-	} else {
-		// late state, no prelude (-n)
-		// placeholder: cfa-cpp is being used experimentally, stay out of the way
-		return ld_concrete;
-	}
-}
-
-
 } // namespace ast
Index: src/AST/Util.hpp
===================================================================
--- src/AST/Util.hpp	(revision d3d54b3f6c6e72820dcc274dd66a67aa194b7ded)
+++ src/AST/Util.hpp	(revision 17fa94fc6137fe38192c7283b80f37fec136dd24)
@@ -26,27 +26,3 @@
 void checkInvariants( TranslationUnit & );
 
-/// Maintains an AST-module state for contextual information needed in
-/// ast::* implementations, notably constructors:
-///    early: while parsing, use bootstrap versions
-///    late: once a whole TranslationUnit exists, use its answers
-/// When the program is in the later state, ast::* construcors effectively get
-/// the benefit of WithTranslationUnit, without having to pass them one.
-class TranslationDeps {
-
-    TranslationDeps() = delete;
-
-    friend class SizeofExpr;
-    friend class AlignofExpr;
-    friend class CountofExpr;
-    friend class OffsetofExpr;
-    friend class OffsetPackExpr;
-
-    /// Appropriate return type for built-in expressions that report on sizes
-    static const Type * getSizeType();
-
-  public:
-    /// Transition from early to late states
-    static void evolve( TranslationUnit & );
-};
-
 }
