Index: doc/LaTeXmacros/common.tex
===================================================================
--- doc/LaTeXmacros/common.tex	(revision fbcde641e97f117504d1c8e0bee89efe2630a6e8)
+++ doc/LaTeXmacros/common.tex	(revision 936a28708699f83408c1b8b57334cf6cc071280c)
@@ -42,4 +42,5 @@
 \newcommand{\CCfourteen}{\rm C\kern-.1em\hbox{+\kern-.25em+}14\xspace} % C++14 symbolic name
 \newcommand{\CCseventeen}{\rm C\kern-.1em\hbox{+\kern-.25em+}17\xspace} % C++17 symbolic name
+\newcommand{\CCtwenty}{\rm C\kern-.1em\hbox{+\kern-.25em+}20} % C++20 symbolic name
 \newcommand{\Celeven}{C11\xspace}		% C11 symbolic name
 \newcommand{\Csharp}{C\raisebox{0.4ex}{\#}\xspace}	% C# symbolic name
@@ -252,5 +253,5 @@
 		_Bool,catch,catchResume,choose,_Complex,__complex,__complex__,__const,__const__,disable,dtype,enable,__extension__,
 		fallthrough,fallthru,finally,forall,ftype,_Generic,_Imaginary,inline,__label__,lvalue,_Noreturn,one_t,otype,restrict,_Static_assert,
-		_Thread_local,throw,throwResume,trait,try,typeof,__typeof,__typeof__,zero_t},
+		_Thread_local,throw,throwResume,trait,try,ttype,typeof,__typeof,__typeof__,zero_t},
 }%
 
Index: doc/rob_thesis/ctordtor.tex
===================================================================
--- doc/rob_thesis/ctordtor.tex	(revision fbcde641e97f117504d1c8e0bee89efe2630a6e8)
+++ doc/rob_thesis/ctordtor.tex	(revision 936a28708699f83408c1b8b57334cf6cc071280c)
@@ -135,8 +135,4 @@
 %   at the global scope (which is likely the most common case)
 % * [9]
-
-% Move semantics
-% * <ongoing discussion about this. this will be filled in
-%    once we come to a consensus>
 
 % Changes to polymorphic type classes
Index: doc/rob_thesis/tuples.tex
===================================================================
--- doc/rob_thesis/tuples.tex	(revision fbcde641e97f117504d1c8e0bee89efe2630a6e8)
+++ doc/rob_thesis/tuples.tex	(revision 936a28708699f83408c1b8b57334cf6cc071280c)
@@ -615,5 +615,5 @@
 \end{cfacode}
 Note that due to flattening, @x@ used in the argument position is converted into the list of its fields.
-In the call to @f@, a the second and third argument components are structured into a tuple argument.
+In the call to @f@, the second and third argument components are structured into a tuple argument.
 
 Expressions which may contain side effects are made into \emph{unique expressions} before being expanded by the flattening conversion.
@@ -643,5 +643,5 @@
 \end{cfacode}
 Since argument evaluation order is not specified by the C programming language, this scheme is built to work regardless of evaluation order.
-The first time a unique expression is executed, the actual expression is evaluated and the accompanying boolean is true to true.
+The first time a unique expression is executed, the actual expression is evaluated and the accompanying boolean is set to true.
 Every subsequent evaluation of the unique expression then results in an access to the stored result of the actual expression.
 
@@ -1299,2 +1299,4 @@
 Thunks 0 through 3 provide wrappers for the @otype@ parameters for @const char *@, while @_thunk4@ translates a call to @print([int, const char *])@ into a call to @print_variadic(int, [const char *])@.
 This all builds to a call to @print_variadic@, with the appropriate copy construction of the tuple argument.
+
+\section{Future Work}
Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision fbcde641e97f117504d1c8e0bee89efe2630a6e8)
+++ src/InitTweak/FixInit.cc	(revision 936a28708699f83408c1b8b57334cf6cc071280c)
@@ -738,10 +738,14 @@
 						stmtsToAddAfter.push_back( ifStmt );
 
-						if ( ctorInit->get_dtor() ) {
+						Statement * dtor = ctorInit->get_dtor();
+						objDecl->set_init( NULL );
+						ctorInit->set_ctor( NULL );
+						ctorInit->set_dtor( nullptr );
+						if ( dtor ) {
 							// if the object has a non-trivial destructor, have to
 							// hoist it and the object into the global space and
 							// call the destructor function with atexit.
 
-							Statement * dtorStmt = ctorInit->get_dtor()->clone();
+							Statement * dtorStmt = dtor->clone();
 
 							// void __objName_dtor_atexitN(...) {...}
@@ -772,12 +776,9 @@
 							objDecl->set_mangleName( SymTab::Mangler::mangle( objDecl ) );
 
-							objDecl->set_init( NULL );
-							ctorInit->set_ctor( NULL );
-							delete ctorInit;
-
 							// xxx - temporary hack: need to return a declaration, but want to hoist the current object out of this scope
 							// create a new object which is never used
 							static UniqueName dummyNamer( "_dummy" );
 							ObjectDecl * dummy = new ObjectDecl( dummyNamer.newName(), Type::StorageClasses( Type::Static ), LinkageSpec::Cforall, 0, new PointerType( Type::Qualifiers(), new VoidType( Type::Qualifiers() ) ), 0, std::list< Attribute * >{ new Attribute("unused") } );
+							delete ctorInit;
 							return dummy;
 						}
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision fbcde641e97f117504d1c8e0bee89efe2630a6e8)
+++ src/InitTweak/GenInit.cc	(revision 936a28708699f83408c1b8b57334cf6cc071280c)
@@ -294,8 +294,8 @@
 		handleDWT( objDecl );
 		// hands off if @=, extern, builtin, etc.
-		// if global but initializer is not constexpr, always try to construct, since this is not legal C
-		if ( ( tryConstruct( objDecl ) && isManaged( objDecl ) ) || (! inFunction && ! isConstExpr( objDecl->get_init() ) ) ) {
+		// even if unmanaged, try to construct global or static if initializer is not constexpr, since this is not legal C
+		if ( tryConstruct( objDecl ) && ( isManaged( objDecl ) || ((! inFunction || objDecl->get_storageClasses().is_static ) && ! isConstExpr( objDecl->get_init() ) ) ) ) {
 			// constructed objects cannot be designated
-			if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.", objDecl );
+			if ( isDesignated( objDecl->get_init() ) ) throw SemanticError( "Cannot include designations in the initializer for a managed Object. If this is really what you want, then initialize with @=.\n", objDecl );
 			// constructed objects should not have initializers nested too deeply
 			if ( ! checkInitDepth( objDecl ) ) throw SemanticError( "Managed object's initializer is too deep ", objDecl );
Index: src/libcfa/iostream.c
===================================================================
--- src/libcfa/iostream.c	(revision fbcde641e97f117504d1c8e0bee89efe2630a6e8)
+++ src/libcfa/iostream.c	(revision 936a28708699f83408c1b8b57334cf6cc071280c)
@@ -154,5 +154,5 @@
 ostype * ?|?( ostype * os, const char * cp ) {
 	enum { Open = 1, Close, OpenClose };
-	static const unsigned char mask[256] = {
+	static const unsigned char mask[256] @= {
 		// opening delimiters, no space after
 		['('] : Open, ['['] : Open, ['{'] : Open,
