Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision f46bfd2ff00d79d3459719a6fb78190275e35e0f)
+++ src/AST/Convert.cpp	(revision 0b73f0cd5f12dd95097dbdf9ad89a93ff3d695da)
@@ -735,6 +735,12 @@
 		expr->var = get<DeclarationWithType>().accept1(node->var);
 		Type * type = expr->var->get_type()->clone();
+		if(FunctionType * ft = dynamic_cast<FunctionType*>(type)) {
+			if(node->result.as<ast::PointerType>()) {
+				type = new PointerType({}, ft);
+			}
+		}
+
 		type->set_lvalue( true );
-		expr->set_result( type );
+		expr->result = type ;
 		this->node = expr;
 		return nullptr;
@@ -782,5 +788,6 @@
 			assert (!rslt->isType);
 		}
-		if (node->type) {
+		else {
+			assert(node->type);
 			rslt = new SizeofExpr(
 				get<Type>().accept1(node->type)
@@ -803,5 +810,6 @@
 			assert (!rslt->isType);
 		}
-		if (node->type) {
+		else {
+			assert(node->type);
 			rslt = new AlignofExpr(
 				get<Type>().accept1(node->type)
@@ -2149,5 +2157,5 @@
 		);
 
-		visitBaseExpr( old,
+		visitBaseExpr_SkipResultType( old,
 			expr
 		);
@@ -2155,4 +2163,9 @@
 		expr->var = GET_ACCEPT_1(var, DeclWithType);
 		expr->result = expr->var->get_type();
+		if(const ast::FunctionType * ft = expr->result.as<ast::FunctionType>()) {
+			if(dynamic_cast<PointerType *>(old->result)) {
+				expr->result = new ast::PointerType(ft);
+			}
+		}
 		add_qualifiers( expr->result, ast::CV::Lvalue );
 		this->node = expr;
Index: src/GenPoly/Lvalue.cc
===================================================================
--- src/GenPoly/Lvalue.cc	(revision f46bfd2ff00d79d3459719a6fb78190275e35e0f)
+++ src/GenPoly/Lvalue.cc	(revision 0b73f0cd5f12dd95097dbdf9ad89a93ff3d695da)
@@ -196,4 +196,7 @@
 				unsigned int i = 0;
 				const unsigned int end = ftype->parameters.size();
+
+				/// The for loop may eagerly dereference the iterators and fail on empty lists
+				if(i == end) { return appExpr; }
 				for ( auto p : unsafe_group_iterate( appExpr->args, ftype->parameters ) ) {
 					if (i == end) break;
