Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/InitTweak/GenInit.cc	(revision 5479e63ba74f6aaf13306acbbd3bf070405dc4b8)
@@ -162,7 +162,7 @@
 						// but it seems reasonable at the moment for this to be done by makeArrayFunction
 						// itself
-						assert( ctor.size() == 1 );
-						assert( dtor.size() == 1 );
-						objDecl->set_init( new ConstructorInit( new ImplicitCtorDtorStmt( ctor.front() ), new ImplicitCtorDtorStmt( dtor.front() ), objDecl->get_init() ) );
+						assert( ctor.size() == 1 && dynamic_cast< ImplicitCtorDtorStmt * >( ctor.front() ) );
+						assert( dtor.size() == 1 && dynamic_cast< ImplicitCtorDtorStmt * >( dtor.front() ) );
+						objDecl->set_init( new ConstructorInit( ctor.front(), dtor.front(), objDecl->get_init() ) );
 					} else {
 						// array came with an initializer list: initialize each element
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/InitTweak/InitTweak.cc	(revision 5479e63ba74f6aaf13306acbbd3bf070405dc4b8)
@@ -66,8 +66,15 @@
 		} else if ( CompoundStmt * compoundStmt = dynamic_cast< CompoundStmt * >( stmt ) ) {
 			// could also be a compound statement with a loop, in the case of an array
-			assert( compoundStmt->get_kids().size() == 2 ); // loop variable and loop
-			ForStmt * forStmt = dynamic_cast< ForStmt * >( compoundStmt->get_kids().back() );
-			assert( forStmt && forStmt->get_body() );
-			return getCtorDtorCall( forStmt->get_body() );
+			if( compoundStmt->get_kids().size() == 2 ) {
+				// loop variable and loop
+				ForStmt * forStmt = dynamic_cast< ForStmt * >( compoundStmt->get_kids().back() );
+				assert( forStmt && forStmt->get_body() );
+				return getCtorDtorCall( forStmt->get_body() );
+			} else if ( compoundStmt->get_kids().size() == 1 ) {
+				// should be the call statement, but in any case there's only one option
+				return getCtorDtorCall( compoundStmt->get_kids().front() );
+			} else {
+				assert( false && "too many statements in compoundStmt for getCtorDtorCall" );
+			}
 		} if ( ImplicitCtorDtorStmt * impCtorDtorStmt = dynamic_cast< ImplicitCtorDtorStmt * > ( stmt ) ) {
 			return getCtorDtorCall( impCtorDtorStmt->get_callStmt() );
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/ResolvExpr/Resolver.cc	(revision 5479e63ba74f6aaf13306acbbd3bf070405dc4b8)
@@ -545,5 +545,5 @@
 			// get Variable <array>, then get the base type of the VariableExpr - this is the type that needs to be fixed
 			Expression * arr = InitTweak::getCallArg( plusExpr, 0 );
-			assert( dynamic_cast< VariableExpr * >( arr ) );
+			assert( dynamic_cast< VariableExpr * >( arr ) || dynamic_cast< MemberExpr *>( arr ) );
 			assert( arr && arr->get_results().size() == 1 );
 			type = arr->get_results().front()->clone();
@@ -554,5 +554,5 @@
 			assert( constructee->get_results().size() == 1 );
 			AddressExpr * addrExpr = dynamic_cast< AddressExpr * > ( constructee );
-			assert( addrExpr && addrExpr->get_results().size() == 1);
+			assert( addrExpr && addrExpr->get_results().size() == 1 );
 			type = addrExpr->get_results().front()->clone();
 		}
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/SymTab/Autogen.cc	(revision 5479e63ba74f6aaf13306acbbd3bf070405dc4b8)
@@ -82,5 +82,13 @@
 		}
 
-		*out++ = new ExprStmt( noLabels, fExpr );
+		Statement * callStmt = new ExprStmt( noLabels, fExpr );
+		if ( (fname == "?{}" || fname == "^?{}") && ( !obj || ( obj && obj->get_bitfieldWidth() == NULL ) ) ) {
+			// implicitly generated ctor/dtor calls should be wrapped
+			// so that later passes are aware they were generated.
+			// xxx - don't mark as an implicit ctor/dtor if obj is a bitfield,
+			// because this causes the address to be taken at codegen, which is illegal in C.
+			callStmt = new ImplicitCtorDtorStmt( callStmt );
+		}
+		*out++ = callStmt;
 	}
 
@@ -242,6 +250,6 @@
 				}
 
-				if ( type->get_qualifiers().isConst ) {
-					// don't assign const members
+				if ( type->get_qualifiers().isConst && func->get_name() == "?=?" ) {
+					// don't assign const members, but do construct/destruct
 					continue;
 				}
Index: src/SymTab/Autogen.h
===================================================================
--- src/SymTab/Autogen.h	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/SymTab/Autogen.h	(revision 5479e63ba74f6aaf13306acbbd3bf070405dc4b8)
@@ -91,5 +91,12 @@
     block->get_kids().push_back( new DeclStmt( noLabels, index ) );
     block->get_kids().push_back( new ForStmt( noLabels, initList, cond, inc, new ExprStmt( noLabels, fExpr ) ) );
-    *out++ = block;
+
+    Statement * stmt = block;
+    if ( fname == "?{}" || fname == "^?{}" ) {
+      // implicitly generated ctor/dtor calls should be wrapped
+      // so that later passes are aware they were generated
+      stmt = new ImplicitCtorDtorStmt( stmt );
+    }
+    *out++ = stmt;
   }
 } // namespace SymTab
Index: src/tests/.expect/extension.txt
===================================================================
--- src/tests/.expect/extension.txt	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/tests/.expect/extension.txt	(revision 5479e63ba74f6aaf13306acbbd3bf070405dc4b8)
@@ -20,32 +20,32 @@
 }
 static inline void ___constructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
-    ((void)((*___dst__P2sS_1).__a__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__b__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__c__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
 }
 static inline void ___constructor__F_P2sS2sS_autogen___1(struct S *___dst__P2sS_1, struct S ___src__2sS_1){
-    ((void)((*___dst__P2sS_1).__a__i_1=___src__2sS_1.__a__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__b__i_1=___src__2sS_1.__b__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__c__i_1=___src__2sS_1.__c__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=___src__2sS_1.__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=___src__2sS_1.__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=___src__2sS_1.__c__i_1) /* ?{} */);
 }
 static inline void ___destructor__F_P2sS_autogen___1(struct S *___dst__P2sS_1){
-    ((void)((*___dst__P2sS_1).__c__i_1) /* ^?{} */);
-    ((void)((*___dst__P2sS_1).__b__i_1) /* ^?{} */);
-    ((void)((*___dst__P2sS_1).__a__i_1) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ^?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))) /* ^?{} */);
 }
 static inline void ___constructor__F_P2sSi_autogen___1(struct S *___dst__P2sS_1, int __a__i_1){
-    ((void)((*___dst__P2sS_1).__a__i_1=__a__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__b__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__c__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
 }
 static inline void ___constructor__F_P2sSii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1){
-    ((void)((*___dst__P2sS_1).__a__i_1=__a__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__b__i_1=__b__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__c__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))) /* ?{} */);
 }
 static inline void ___constructor__F_P2sSiii_autogen___1(struct S *___dst__P2sS_1, int __a__i_1, int __b__i_1, int __c__i_1){
-    ((void)((*___dst__P2sS_1).__a__i_1=__a__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__b__i_1=__b__i_1) /* ?{} */);
-    ((void)((*___dst__P2sS_1).__c__i_1=__c__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__a__i_1)))=__a__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__b__i_1)))=__b__i_1) /* ?{} */);
+    ((void)((*((int *)(&(*___dst__P2sS_1).__c__i_1)))=__c__i_1) /* ?{} */);
 }
 __extension__ union U {
