Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 20eacb74465532b7924bf06b89d257a794c9c405)
+++ src/InitTweak/FixInit.cc	(revision 10dc6908986ce4acc35ec27134258bfcfe4d5322)
@@ -1055,5 +1055,5 @@
 								// function->get_statements()->push_back( callStmt );
 
-								// Destructor _dtor0 = { &b.a1, _destroy_A };
+								// Destructor _dtor0 = { &b.a1, (void (*)(void *)_destroy_A };
 								std::list< Statement * > stmtsToAdd;
 
@@ -1065,5 +1065,10 @@
 								Expression * dtorExpr = new VariableExpr( getDtorFunc( thisParam, callStmt, stmtsToAdd ) );
 
-								ObjectDecl * destructor = ObjectDecl::newObject( memberDtorNamer.newName(), new StructInstType( Type::Qualifiers(), dtorStruct ), new ListInit( { new SingleInit( thisExpr ), new SingleInit( dtorExpr ) } ) );
+								// cast destructor pointer to void (*)(void *), to silence GCC incompatible pointer warnings
+								FunctionType * dtorFtype = new FunctionType( Type::Qualifiers(), false );
+								dtorFtype->parameters.push_back( ObjectDecl::newObject( "", new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), nullptr ) );
+								Type * dtorType = new PointerType( Type::Qualifiers(), dtorFtype );
+
+								ObjectDecl * destructor = ObjectDecl::newObject( memberDtorNamer.newName(), new StructInstType( Type::Qualifiers(), dtorStruct ), new ListInit( { new SingleInit( thisExpr ), new SingleInit( new CastExpr( dtorExpr, dtorType ) ) } ) );
 								function->statements->push_front( new DeclStmt( noLabels, destructor ) );
 								destructor->attributes.push_back( new Attribute( "cleanup", { new VariableExpr( dtorStructDestroy ) } ) );
