Index: Jenkins/FullBuild
===================================================================
--- Jenkins/FullBuild	(revision e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
+++ Jenkins/FullBuild	(revision e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -0,0 +1,117 @@
+#!groovy
+
+//===========================================================================================================
+// Main compilation routines
+//===========================================================================================================
+def push_build() {
+	//Don't use the build_stage function which outputs the compiler
+	stage 'Push'
+
+		status_prefix = 'Push'
+
+		def out_dir = pwd tmp: true
+		sh "mkdir -p ${out_dir}"
+
+		//parse git logs to find what changed
+		sh "git remote > ${out_dir}/GIT_REMOTE"
+		git_remote = readFile("${out_dir}/GIT_REMOTE")
+		remoteDoLangExists = git_remote.contains("DoLang")
+
+		if( !remoteDoLangExists ) {
+			sh 'git remote add DoLang git@gitlab.do-lang.org:internal/cfa-cc.git'
+		}
+
+		sh "git push DoLang ${gitRefNewValue}:master"
+}
+
+//===========================================================================================================
+// Main loop of the compilation
+//===========================================================================================================
+node ('master'){
+	try {
+		//Prevent the build from exceeding 30 minutes
+		timeout(60) {
+
+			//Wrap build to add timestamp to command line
+			wrap([$class: 'TimestamperBuildWrapper']) {
+
+				stage 'Build'
+
+					parallel (
+						x64: { node ('master') {
+							build job: 'Cforall/master', 					\
+								parameters: [						\
+									[$class: 'BooleanParameterValue', 		\
+									  name: 'isFullBuild', 				\
+									  value: true], 					\
+									[$class: 'StringParameterValue', 		\
+									  name: 'buildArchitecture', 			\
+									  value: '64-bit']				\
+								]
+						}},
+						x32: { node ('master') {
+							build job: 'Cforall/master', 					\
+								parameters: [						\
+									[$class: 'BooleanParameterValue', 		\
+									  name: 'isFullBuild', 				\
+									  value: true], 					\
+									[$class: 'StringParameterValue', 		\
+									  name: 'buildArchitecture', 			\
+									  value: '32-bit']				\
+								]
+						}}
+					)
+
+				//Push latest changes to do-lang repo
+				//push_build()
+			}
+		}
+	}
+
+	//If an exception is caught we need to change the status and remember to
+	//attach the build log to the email
+	catch (Exception caughtError) {
+		//rethrow error later
+		err = caughtError
+
+		//Store the result of the build log
+		currentBuild.result = "${status_prefix} FAILURE".trim()
+
+		//Send email to notify the failure
+		//promote_email(currentBuild.result)
+	}
+
+	finally {
+		//Must re-throw exception to propagate error
+		if (err) {
+			throw err
+		}
+	}
+}
+
+//===========================================================================================================
+//Routine responsible of sending the email notification once the build is completed
+//===========================================================================================================
+
+//Email notification on a full build failure
+def promote_email(String status) {
+	//Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
+	//Configurations for email format
+	def email_subject = "[cforall git][PROMOTE - FAILURE]"
+	def email_body = """This is an automated email from the Jenkins build machine. It was
+generated because of a git hooks/post-receive script following
+a ref change was pushed to the repository containing
+the project "UNNAMED PROJECT".
+
+Check console output at ${env.BUILD_URL} to view the results.
+
+- Status --------------------------------------------------------------
+
+PROMOTE FAILURE - ${status}
+"""
+
+	def email_to = "pabuhr@uwaterloo.ca, rschlunt@uwaterloo.ca, a3moss@uwaterloo.ca, tdelisle@uwaterloo.ca, brice.dobry@huawei.com"
+
+	//send email notification
+	emailext body: email_body, subject: email_subject, to: email_to, attachLog: true
+}
Index: Jenkinsfile
===================================================================
--- Jenkinsfile	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ Jenkinsfile	(revision e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -2,8 +2,8 @@
 
 //===========================================================================================================
-// Main compilation routine
+// Main compilation routines
 //===========================================================================================================
 //Compilation script is done here but environnement set-up and error handling is done in main loop
-def cfa_build(boolean full_build) {
+def cfa_build(boolean full_build, String flags) {
 	build_stage 'Checkout'
 		def install_dir = pwd tmp: true
@@ -23,5 +23,5 @@
 		//escapes the sandbox
 		//Also specify the compiler by hand
-		sh "./configure CXX=${currentCC.cpp_cc} --with-backend-compiler=${currentCC.cfa_backend_cc} --prefix=${install_dir} --enable-silent-rules --quiet"
+		sh "./configure CXX=${currentCC.cpp_cc} CXXFLAGS=${flags} CFAFLAGS=${flags} --with-backend-compiler=${currentCC.cfa_backend_cc} --prefix=${install_dir} --enable-silent-rules --quiet"
 
 		//Compile the project
@@ -83,25 +83,4 @@
 }
 
-def push_build() {
-	//Don't use the build_stage function which outputs the compiler
-	stage 'Push'
-
-		status_prefix = 'Push'
-
-		def out_dir = pwd tmp: true
-		sh "mkdir -p ${out_dir}"
-
-		//parse git logs to find what changed
-		sh "git remote > ${out_dir}/GIT_REMOTE"
-		git_remote = readFile("${out_dir}/GIT_REMOTE")
-		remoteDoLangExists = git_remote.contains("DoLang")
-
-		if( !remoteDoLangExists ) {
-			sh 'git remote add DoLang git@gitlab.do-lang.org:internal/cfa-cc.git'
-		}
-
-		sh "git push DoLang ${gitRefNewValue}:master"
-}
-
 //===========================================================================================================
 // Helper classes/variables/routines to make the status and stage name easier to use
@@ -155,5 +134,5 @@
 node ('master'){
 
-	boolean doPromoteBuild2DoLang
+	boolean bIsFullBuild
 	def err = null
 	def log_needed = false
@@ -176,30 +155,34 @@
 						  defaultValue: false,  					\
 						  description: 'If true, the build will be promoted to the do-lang git repository (on successful builds only)', \
-						  name: 'promoteBuild2DoLang' 				\
-						]] 									\
+						  name: 'isFullBuild' 					\
+						], 								\
+						[$class: 'ChoiceParameterDefinition',				\
+						  choices: '64-bit\n32-bit',					\
+						  defaultValue: '64-bit',					\
+						  description: 'The architecture to use for compilation',	\
+						  name: 'buildArchitecture'					\
+						]]								\
 					]])
 
-				doPromoteBuild2DoLang = promoteBuild2DoLang == 'true'
-
-				echo "FULL BUILD = ${doPromoteBuild2DoLang}"
+				bIsFullBuild = isFullBuild == 'true'
+				architectureFlag = buildArchitecture == '64-bit' ? '-m64' : (buildArchitecture == '32-bit' ? '-m32' : 'ERROR')
+
+				echo "FULL BUILD = ${isFullBuild}\nArchitecture = ${buildArchitecture} (flag ${architectureFlag})"
 
 				//Compile using gcc-4.9
 				currentCC = new CC_Desc('gcc-4.9', 'g++-4.9', 'gcc-4.9')
-				cfa_build(doPromoteBuild2DoLang)
+				cfa_build(bIsFullBuild, architectureFlag)
 
 				//Compile latex documentation
 				doc_build()
 
-				if( doPromoteBuild2DoLang ) {
+				if( bIsFullBuild ) {
 					//Compile using gcc-5
 					currentCC = new CC_Desc('gcc-5', 'g++-5', 'gcc-5')
-					cfa_build(true)
+					cfa_build(true, architectureFlag)
 
 					//Compile using gcc-4.9
 					currentCC = new CC_Desc('gcc-6', 'g++-6', 'gcc-6')
-					cfa_build(true)
-
-					//Push latest changes to do-lang repo
-					push_build()
+					cfa_build(true, architectureFlag)
 				}
 			}
@@ -221,6 +204,11 @@
 
 	finally {
-		//Send email with final results
-		notify_result(doPromoteBuild2DoLang, err, currentBuild.result, log_needed)
+		echo 'Build Completed'
+
+		//Send email with final results if this is not a full build
+		if( !bIsFullBuild ) {
+			echo 'Notifying users of result'
+			email(currentBuild.result, log_needed)
+		}
 
 		/* Must re-throw exception to propagate error */
@@ -234,39 +222,4 @@
 //Routine responsible of sending the email notification once the build is completed
 //===========================================================================================================
-def notify_result(boolean promote, Exception err, String status, boolean log) {
-	echo 'Build completed, sending result notification'
-	if(promote)	{
-		if( err ) {
-			promote_email(status)
-		}
-	}
-	else {
-		email(status, log)
-	}
-}
-
-//Email notification on a full build failure
-def promote_email(String status) {
-	//Since tokenizer doesn't work, figure stuff out from the environnement variables and command line
-	//Configurations for email format
-	def email_subject = "[cforall git][PROMOTE - FAILURE]"
-	def email_body = """This is an automated email from the Jenkins build machine. It was
-generated because of a git hooks/post-receive script following
-a ref change was pushed to the repository containing
-the project "UNNAMED PROJECT".
-
-Check console output at ${env.BUILD_URL} to view the results.
-
-- Status --------------------------------------------------------------
-
-PROMOTE FAILURE - ${status}
-"""
-
-	def email_to = "pabuhr@uwaterloo.ca, rschlunt@uwaterloo.ca, a3moss@uwaterloo.ca, tdelisle@uwaterloo.ca, brice.dobry@huawei.com"
-
-	//send email notification
-	emailext body: email_body, subject: email_subject, to: email_to, attachLog: true
-}
-
 //Standard build email notification
 def email(String status, boolean log) {
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 4e06c1ebfdf762654ec91b9a78bae607f25fba19)
+++ src/InitTweak/GenInit.cc	(revision e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -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 e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -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 e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -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 e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -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 e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -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 e4d3cebea9b65b73a14d75ede42b6858dafb71f5)
@@ -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 {
