Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision 310e5b7a73ac432e83f04a8d32b171a31ac8c68f)
+++ src/Concurrency/Waitfor.cc	(revision 8f98b782aebdb59bd3ba7eae826ba604a978928a)
@@ -214,5 +214,5 @@
 		}
 
-		Expression * betterIsDtor( Expression * func ) {
+		Expression * detectIsDtor( Expression * func ) {
 			VariableExpr * typed_func = extractVariable( func );
 			bool is_dtor = InitTweak::isDestructor( typed_func->var );
@@ -302,7 +302,10 @@
 			new ArrayType(
 				noQualifiers,
-				new StructInstType(
+				new PointerType(
 					noQualifiers,
-					decl_monitor
+					new StructInstType(
+						noQualifiers,
+						decl_monitor
+					)
 				),
 				new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ),
@@ -312,5 +315,21 @@
 			new ListInit(
 				map_range < std::list<Initializer*> > ( clause.target.arguments, [this](Expression * expr ){
-					return new SingleInit( expr );
+					Expression * untyped = new CastExpr(
+						new UntypedExpr(
+							new NameExpr( "get_monitor" ),
+							{ expr }
+						),
+						new PointerType(
+							noQualifiers,
+							new StructInstType(
+								noQualifiers,
+								decl_monitor
+							)
+						)
+					);
+
+					Expression * init = ResolvExpr::findSingleExpression( untyped, indexer );
+					delete untyped;
+					return new SingleInit( init );
 				})
 			)
@@ -328,10 +347,9 @@
 		Type * fptr_t = new PointerType( noQualifiers, new FunctionType( noQualifiers, true ) );
 
-		Expression * is_dtor = betterIsDtor( clause.target.function );
 		CompoundStmt * compound = new CompoundStmt( noLabels );
+		compound->push_back( makeAccStatement( acceptables, index, "is_dtor" , detectIsDtor( clause.target.function )                                    , indexer ) );
 		compound->push_back( makeAccStatement( acceptables, index, "func"    , new CastExpr( clause.target.function, fptr_t )                            , indexer ) );
+		compound->push_back( makeAccStatement( acceptables, index, "monitors", new VariableExpr( monitors )                                              , indexer ) );
 		compound->push_back( makeAccStatement( acceptables, index, "count"   , new ConstantExpr( Constant::from_ulong( clause.target.arguments.size() ) ), indexer ) );
-		compound->push_back( makeAccStatement( acceptables, index, "monitors", new VariableExpr( monitors )                                              , indexer ) );
-		compound->push_back( makeAccStatement( acceptables, index, "is_dtor" , is_dtor                                                                   , indexer ) );
 
 		stmt->push_back( new IfStmt(
