Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 0b4d93ab69edf7fa57003bb50480e01377bd9ac4)
+++ src/SymTab/Autogen.cc	(revision b94206bff36d3d9975c3b7cd8b0533281f29b3e2)
@@ -84,5 +84,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;
 	}
 
@@ -244,6 +252,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 0b4d93ab69edf7fa57003bb50480e01377bd9ac4)
+++ src/SymTab/Autogen.h	(revision b94206bff36d3d9975c3b7cd8b0533281f29b3e2)
@@ -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
