Index: doc/LaTeXmacros/common.tex
===================================================================
--- doc/LaTeXmacros/common.tex	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ doc/LaTeXmacros/common.tex	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -11,6 +11,6 @@
 %% Created On       : Sat Apr  9 10:06:17 2016
 %% Last Modified By : Peter A. Buhr
-%% Last Modified On : Fri Feb 10 11:48:00 2023
-%% Update Count     : 564
+%% Last Modified On : Fri Feb 17 08:32:47 2023
+%% Update Count     : 565
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
@@ -269,4 +269,5 @@
 \newcommand{\LstCommentStyle}[1]{{\lst@basicstyle{\lst@commentstyle{#1}}}}
 \newcommand{\LstStringStyle}[1]{{\lst@basicstyle{\lst@stringstyle{#1}}}}
+\newcommand{\LstNumberStyle}[1]{{\lst@basicstyle{\lst@numberstyle{#1}}}}
 
 \newlength{\gcolumnposn}				% temporary hack because lstlisting does not handle tabs correctly
Index: doc/bibliography/pl.bib
===================================================================
--- doc/bibliography/pl.bib	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ doc/bibliography/pl.bib	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -799,4 +799,5 @@
 
 @article{Joung00,
+    keywords	= {group mutual exclusion, congenial talking philosophers, resource allocation, shared-memory algorithms},
     author	= {Joung, Yuh-Jzer},
     title	= {Asynchronous group mutual exclusion},
@@ -1115,4 +1116,18 @@
 }
 
+@inproceedings{CAF,
+    keywords	= {performance measurement, actor model, c++, message-oriented middleware, distributed debugging},
+    author	= {Charousset, Dominik and Hiesgen, Raphael and Schmidt, Thomas C.},
+    title	= {{CAF} - the {C}++ Actor Framework for Scalable and Resource-Efficient Applications},
+    publisher	= {ACM},
+    address	= {New York, NY, USA},
+    organization= {Proceedings of the 4th International Workshop on Programming Based on Actors Agents \& Decentralized Control},
+    pages	= {15-28},
+    numpages	= {14},
+    location	= {Portland, Oregon, USA},
+    series	= {AGERE'14},
+    year	= {2014},
+}
+
 @techreport{cfa-cc,
     keywords	= {Cforall, cfa-cc, transpiler},
@@ -1297,5 +1312,5 @@
 @techreport{Prokopec11,
     keywords	= {ctrie, concurrent map},
-    contributer = {a3moss@uwaterloo.ca},
+    contributer	= {a3moss@uwaterloo.ca},
     title	= {Cache-aware lock-free concurrent hash tries},
     author	= {Prokopec, Aleksandar and Bagwell, Phil and Odersky, Martin},
@@ -1621,5 +1636,5 @@
     author	= {Emery D. Berger and Benjamin G. Zorn and Kathryn S. McKinley},
     title	= {Composing High-Performance Memory Allocators},
-    booktitle	= {{SIGPLAN} Conference on Programming Language Design and Implementation},
+    organization= {{SIGPLAN} Conference on Programming Language Design and Implementation},
     pages	= {114-124},
     year	= 2001,
@@ -2121,5 +2136,6 @@
     address	= {Eindhoven, Neth.},
     year	= 1965,
-    note	= {Reprinted in \cite{Genuys68} pp. 43--112.}
+    optnote	= {Reprinted in \cite{Genuys68} pp. 43--112.}
+    note	= {\url{https://pure.tue.nl/ws/files/4279816/344354178746665.pdf}},
 }
 
@@ -6226,5 +6242,5 @@
     organization= {USENIX Association},
     year	= 1988,
-    pages	= {1-18}
+    pages	= {1-18},
 }
 
@@ -7513,4 +7529,26 @@
 }
 
+@article{Nickolls08,
+    author	= {Nickolls, John and Buck, Ian and Garland, Michael and Skadron, Kevin},
+    title	= {Scalable Parallel Programming with CUDA},
+    journal	= {Queue},
+    volume	= {6},
+    number	= {2},
+    month	= mar,
+    year	= 2008,
+    pages	= {40-53},
+    publisher	= {ACM},
+    address	= {New York, NY, USA},
+}
+
+@inproceedings{Leissa14,
+    title	= {{S}ierra: a {SIMD} extension for {C}++},
+    author	= {Lei{\ss}a, Roland and Haffner, Immanuel and Hack, Sebastian},
+    booktitle	= {Proceedings of the 2014 Workshop on Workshop on programming models for SIMD/Vector processing},
+    pages	= {17-24},
+    year	= {2014},
+    organization= {ACM}
+}
+
 @inproceedings{Howard76b,
     keywords	= {monitors},
@@ -8483,5 +8521,5 @@
     author	= {Paul R. Wilson},
     title	= {Uniprocessor Garbage Collection Techniques},
-    booktitle	= {Proceedings of the International Workshop on Memory Management},
+    organization= {Proceedings of the International Workshop on Memory Management},
     location	= {St. Malo, France},
     publisher	= {Springer},
Index: doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py
===================================================================
--- doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ doc/theses/colby_parsons_MMAth/benchmarks/actors/plotData.py	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -53,4 +53,5 @@
     Static = 7
     Dynamic = 8
+    Mem = 9
 
 nameSet = False
@@ -90,4 +91,7 @@
             name = "Dynamic"
             currBench = Bench.Dynamic
+        elif line == "mem":
+            name = "ExecutorMemory"
+            currBench = Bench.Mem
         else:
             print("Expected benchmark name")
@@ -98,5 +102,5 @@
         continue
 
-    if currBench == Bench.Static or currBench == Bench.Dynamic:
+    if currBench == Bench.Static or currBench == Bench.Dynamic or currBench == Bench.Mem:
         if not nameSet:
             nameSet = True
@@ -116,8 +120,13 @@
                 if currBench == Bench.Static:
                     fileName += "SendStatic"
+                elif currBench == Bench.Dynamic:
+                    fileName += "SendDynamic"
                 else:
-                    fileName += "SendDynamic"
+                    fileName += "ExecutorMem"
                 f = open(fileName, 'w')
-                f.write(" & ".join(map(lambda a: str(int(a)) + 'ns', sendData)))
+                if currBench == Bench.Mem:
+                    f.write(" & ".join(map(lambda a: str(int(a/1000)) + 'MB', sendData)))
+                else:
+                    f.write(" & ".join(map(lambda a: str(int(a)) + 'ns', sendData)))
 
                 # reset
@@ -162,5 +171,5 @@
                     plt.xticks(procs)
                     ax.legend(names)
-                    # fig.savefig("plots/" + name + ".png")
+                    # fig.savefig("plots/" + machineName + name + ".png")
                     plt.savefig("plots/" + machineName + name + ".pgf")
                     fig.clf()
Index: libcfa/src/algorithms/range_iterator.hfa
===================================================================
--- libcfa/src/algorithms/range_iterator.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/algorithms/range_iterator.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -9,8 +9,10 @@
 // Author           : Thierry Delisle
 // Created On       : Tue Nov 30 13:06:22 2021
-// Last Modified By :
-// Last Modified On :
-// Update Count     :
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Mar 13 23:10:35 2023
+// Update Count     : 1
 //
+
+#pragma once
 
 generator RangeIter {
Index: libcfa/src/bits/weakso_locks.hfa
===================================================================
--- libcfa/src/bits/weakso_locks.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/bits/weakso_locks.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/concurrency/barrier.hfa
===================================================================
--- libcfa/src/concurrency/barrier.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/barrier.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/concurrency/channel.hfa
===================================================================
--- libcfa/src/concurrency/channel.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/channel.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -1,2 +1,4 @@
+#pragma once
+
 #include <locks.hfa>
 
Index: libcfa/src/concurrency/clib/cfathread.cfa
===================================================================
--- libcfa/src/concurrency/clib/cfathread.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/clib/cfathread.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -17,7 +17,4 @@
 
 #include <string.h>
-#include <errno.h>
-#include <unistd.h>
-#include <sys/socket.h>
 
 #include "fstream.hfa"
Index: libcfa/src/concurrency/clib/cfathread.h
===================================================================
--- libcfa/src/concurrency/clib/cfathread.h	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/clib/cfathread.h	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -10,7 +10,9 @@
 // Created On       : Tue Sep 22 15:31:20 2020
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 25 17:39:20 2023
-// Update Count     : 6
+// Last Modified On : Mon Mar 13 23:48:40 2023
+// Update Count     : 7
 //
+
+#pragma once
 
 #if defined(__cforall) || defined(__cplusplus)
Index: libcfa/src/concurrency/future.hfa
===================================================================
--- libcfa/src/concurrency/future.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/future.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -14,5 +14,5 @@
 //
 
-// #pragma once
+#pragma once
 
 #include "bits/locks.hfa"
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/invoke.h	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -10,7 +10,9 @@
 // Created On       : Tue Jan 17 12:27:26 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Nov 29 20:42:21 2022
-// Update Count     : 56
-//
+// Last Modified On : Tue Mar 14 13:39:31 2023
+// Update Count     : 59
+//
+
+// No not use #pragma once was this file is included twice in some places. It has its own guard system.
 
 #include "bits/containers.hfa"
Index: libcfa/src/concurrency/io/types.hfa
===================================================================
--- libcfa/src/concurrency/io/types.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/io/types.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/concurrency/iofwd.hfa
===================================================================
--- libcfa/src/concurrency/iofwd.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/iofwd.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -9,7 +9,7 @@
 // Author           : Thierry Delisle
 // Created On       : Thu Apr 23 17:31:00 2020
-// Last Modified By :
-// Last Modified On :
-// Update Count     :
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Mon Mar 13 23:54:57 2023
+// Update Count     : 1
 //
 
@@ -50,13 +50,5 @@
 typedef __off64_t off64_t;
 
-struct cluster;
-struct io_context$;
-
-struct iovec;
-struct msghdr;
-struct statx;
 struct epoll_event;
-
-struct io_uring_sqe;
 
 //-----------------------------------------------------------------------
@@ -89,32 +81,32 @@
 // synchronous calls
 #if defined(CFA_HAVE_PREADV2)
-	extern ssize_t cfa_preadv2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
+	extern ssize_t cfa_preadv2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
 #endif
 #if defined(CFA_HAVE_PWRITEV2)
-	extern ssize_t cfa_pwritev2(int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
+	extern ssize_t cfa_pwritev2(int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
 #endif
 extern int cfa_fsync(int fd, __u64 submit_flags);
-extern int cfa_epoll_ctl(int epfd, int op, int fd, struct epoll_event *event, __u64 submit_flags);
+extern int cfa_epoll_ctl(int epfd, int op, int fd, struct epoll_event * event, __u64 submit_flags);
 extern int cfa_sync_file_range(int fd, off64_t offset, off64_t nbytes, unsigned int flags, __u64 submit_flags);
-extern  ssize_t cfa_sendmsg(int sockfd, const struct msghdr *msg, int flags, __u64 submit_flags);
-extern ssize_t cfa_recvmsg(int sockfd, struct msghdr *msg, int flags, __u64 submit_flags);
-extern ssize_t cfa_send(int sockfd, const void *buf, size_t len, int flags, __u64 submit_flags);
-extern ssize_t cfa_recv(int sockfd, void *buf, size_t len, int flags, __u64 submit_flags);
+extern  ssize_t cfa_sendmsg(int sockfd, const struct msghdr * msg, int flags, __u64 submit_flags);
+extern ssize_t cfa_recvmsg(int sockfd, struct msghdr * msg, int flags, __u64 submit_flags);
+extern ssize_t cfa_send(int sockfd, const void * buf, size_t len, int flags, __u64 submit_flags);
+extern ssize_t cfa_recv(int sockfd, void * buf, size_t len, int flags, __u64 submit_flags);
 extern int cfa_accept4(int sockfd, __SOCKADDR_ARG addr, socklen_t * restrict addrlen, int flags, __u64 submit_flags);
 extern int cfa_connect(int sockfd, __CONST_SOCKADDR_ARG addr, socklen_t addrlen, __u64 submit_flags);
 extern int cfa_fallocate(int fd, int mode, off_t offset, off_t len, __u64 submit_flags);
 extern int cfa_posix_fadvise(int fd, off_t offset, off_t len, int advice, __u64 submit_flags);
-extern int cfa_madvise(void *addr, size_t length, int advice, __u64 submit_flags);
-extern int cfa_openat(int dirfd, const char *pathname, int flags, mode_t mode, __u64 submit_flags);
+extern int cfa_madvise(void * addr, size_t length, int advice, __u64 submit_flags);
+extern int cfa_openat(int dirfd, const char * pathname, int flags, mode_t mode, __u64 submit_flags);
 #if defined(CFA_HAVE_OPENAT2)
-	extern int cfa_openat2(int dirfd, const char *pathname, struct open_how * how, size_t size, __u64 submit_flags);
+	extern int cfa_openat2(int dirfd, const char * pathname, struct open_how * how, size_t size, __u64 submit_flags);
 #endif
 extern int cfa_close(int fd, __u64 submit_flags);
 #if defined(CFA_HAVE_STATX)
-	extern int cfa_statx(int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf, __u64 submit_flags);
+	extern int cfa_statx(int dirfd, const char * pathname, int flags, unsigned int mask, struct statx * statxbuf, __u64 submit_flags);
 #endif
 extern ssize_t cfa_read(int fd, void * buf, size_t count, __u64 submit_flags);
 extern ssize_t cfa_write(int fd, void * buf, size_t count, __u64 submit_flags);
-extern ssize_t cfa_splice(int fd_in, __off64_t *off_in, int fd_out, __off64_t *off_out, size_t len, unsigned int flags, __u64 submit_flags);
+extern ssize_t cfa_splice(int fd_in, __off64_t * off_in, int fd_out, __off64_t * off_out, size_t len, unsigned int flags, __u64 submit_flags);
 extern ssize_t cfa_tee(int fd_in, int fd_out, size_t len, unsigned int flags, __u64 submit_flags);
 
@@ -122,32 +114,32 @@
 // asynchronous calls
 #if defined(CFA_HAVE_PREADV2)
-	extern void async_preadv2(io_future_t & future, int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
+	extern void async_preadv2(io_future_t & future, int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
 #endif
 #if defined(CFA_HAVE_PWRITEV2)
-	extern void async_pwritev2(io_future_t & future, int fd, const struct iovec *iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
+	extern void async_pwritev2(io_future_t & future, int fd, const struct iovec * iov, int iovcnt, off_t offset, int flags, __u64 submit_flags);
 #endif
 extern void async_fsync(io_future_t & future, int fd, __u64 submit_flags);
-extern void async_epoll_ctl(io_future_t & future, int epfd, int op, int fd, struct epoll_event *event, __u64 submit_flags);
+extern void async_epoll_ctl(io_future_t & future, int epfd, int op, int fd, struct epoll_event * event, __u64 submit_flags);
 extern void async_sync_file_range(io_future_t & future, int fd, off64_t offset, off64_t nbytes, unsigned int flags, __u64 submit_flags);
-extern void async_sendmsg(io_future_t & future, int sockfd, const struct msghdr *msg, int flags, __u64 submit_flags);
-extern void async_recvmsg(io_future_t & future, int sockfd, struct msghdr *msg, int flags, __u64 submit_flags);
-extern void async_send(io_future_t & future, int sockfd, const void *buf, size_t len, int flags, __u64 submit_flags);
-extern void async_recv(io_future_t & future, int sockfd, void *buf, size_t len, int flags, __u64 submit_flags);
+extern void async_sendmsg(io_future_t & future, int sockfd, const struct msghdr * msg, int flags, __u64 submit_flags);
+extern void async_recvmsg(io_future_t & future, int sockfd, struct msghdr * msg, int flags, __u64 submit_flags);
+extern void async_send(io_future_t & future, int sockfd, const void * buf, size_t len, int flags, __u64 submit_flags);
+extern void async_recv(io_future_t & future, int sockfd, void * buf, size_t len, int flags, __u64 submit_flags);
 extern void async_accept4(io_future_t & future, int sockfd, __SOCKADDR_ARG addr, socklen_t * restrict addrlen, int flags, __u64 submit_flags);
 extern void async_connect(io_future_t & future, int sockfd, __CONST_SOCKADDR_ARG addr, socklen_t addrlen, __u64 submit_flags);
 extern void async_fallocate(io_future_t & future, int fd, int mode, off_t offset, off_t len, __u64 submit_flags);
 extern void async_posix_fadvise(io_future_t & future, int fd, off_t offset, off_t len, int advice, __u64 submit_flags);
-extern void async_madvise(io_future_t & future, void *addr, size_t length, int advice, __u64 submit_flags);
-extern void async_openat(io_future_t & future, int dirfd, const char *pathname, int flags, mode_t mode, __u64 submit_flags);
+extern void async_madvise(io_future_t & future, void * addr, size_t length, int advice, __u64 submit_flags);
+extern void async_openat(io_future_t & future, int dirfd, const char * pathname, int flags, mode_t mode, __u64 submit_flags);
 #if defined(CFA_HAVE_OPENAT2)
-	extern void async_openat2(io_future_t & future, int dirfd, const char *pathname, struct open_how * how, size_t size, __u64 submit_flags);
+	extern void async_openat2(io_future_t & future, int dirfd, const char * pathname, struct open_how * how, size_t size, __u64 submit_flags);
 #endif
 extern void async_close(io_future_t & future, int fd, __u64 submit_flags);
 #if defined(CFA_HAVE_STATX)
-	extern void async_statx(io_future_t & future, int dirfd, const char *pathname, int flags, unsigned int mask, struct statx *statxbuf, __u64 submit_flags);
+	extern void async_statx(io_future_t & future, int dirfd, const char * pathname, int flags, unsigned int mask, struct statx * statxbuf, __u64 submit_flags);
 #endif
 void async_read(io_future_t & future, int fd, void * buf, size_t count, __u64 submit_flags);
 extern void async_write(io_future_t & future, int fd, void * buf, size_t count, __u64 submit_flags);
-extern void async_splice(io_future_t & future, int fd_in, __off64_t *off_in, int fd_out, __off64_t *off_out, size_t len, unsigned int flags, __u64 submit_flags);
+extern void async_splice(io_future_t & future, int fd_in, __off64_t * off_in, int fd_out, __off64_t * off_out, size_t len, unsigned int flags, __u64 submit_flags);
 extern void async_tee(io_future_t & future, int fd_in, int fd_out, size_t len, unsigned int flags, __u64 submit_flags);
 
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -33,5 +33,5 @@
 #include "kernel/private.hfa"
 #include "iofwd.hfa"
-#include "startup.hfa"					// STARTUP_PRIORITY_XXX
+#include "startup.hfa"									// STARTUP_PRIORITY_XXX
 #include "limits.hfa"
 #include "math.hfa"
Index: libcfa/src/concurrency/mutex_stmt.hfa
===================================================================
--- libcfa/src/concurrency/mutex_stmt.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/mutex_stmt.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -1,2 +1,4 @@
+#pragma once
+
 #include "bits/algorithm.hfa"
 #include "bits/defs.hfa"
Index: libcfa/src/concurrency/once.hfa
===================================================================
--- libcfa/src/concurrency/once.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/once.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/concurrency/pthread.cfa
===================================================================
--- libcfa/src/concurrency/pthread.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/pthread.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -598,5 +598,5 @@
 		if (t->pthreadData == NULL) return NULL;
 		lock(key_lock);
-		pthread_values &entry = ((pthread_values *)t->pthreadData)[key];
+		pthread_values & entry = ((pthread_values *)t->pthreadData)[key];
 		if ( ! entry.in_use ) {
 			unlock( key_lock );
Index: libcfa/src/concurrency/ready_subqueue.hfa
===================================================================
--- libcfa/src/concurrency/ready_subqueue.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/ready_subqueue.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/concurrency/select.hfa
===================================================================
--- libcfa/src/concurrency/select.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/select.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -1,2 +1,4 @@
+#pragma once
+
 #include "containers/list.hfa"
 #include <stdint.h>
Index: libcfa/src/concurrency/snzi.hfa
===================================================================
--- libcfa/src/concurrency/snzi.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/concurrency/snzi.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/containers/lockfree.hfa
===================================================================
--- libcfa/src/containers/lockfree.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/containers/lockfree.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: libcfa/src/containers/vector2.hfa
===================================================================
--- libcfa/src/containers/vector2.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/containers/vector2.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -9,8 +9,10 @@
 // Author           : Michael Brooks
 // Created On       : Thu Jun 23 22:00:00 2021
-// Last Modified By : Michael Brooks
-// Last Modified On : Thu Jun 23 22:00:00 2021
-// Update Count     : 1
-//
+// Last Modified By : Peter A. Buhr
+// Last Modified On : Tue Mar 14 08:40:53 2023
+// Update Count     : 2
+//
+
+#pragma once
 
 #include <stdlib.hfa>
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/interpose.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -10,13 +10,10 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  2 13:56:26 2023
-// Update Count     : 191
-//
-
-#include <stdarg.h>										// va_start, va_end
+// Last Modified On : Mon Mar 13 22:39:12 2023
+// Update Count     : 193
+//
+
 #include <stdio.h>
-#include <string.h>										// strlen
 #include <unistd.h>										// _exit, getpid
-#include <signal.h>
 extern "C" {
 #include <dlfcn.h>										// dlopen, dlsym
@@ -24,5 +21,4 @@
 }
 
-#include "bits/debug.hfa"
 #include "bits/defs.hfa"
 #include "bits/signal.hfa"								// sigHandler_?
@@ -40,13 +36,12 @@
 
 typedef void (* generic_fptr_t)(void);
+
 static generic_fptr_t do_interpose_symbol( void * library, const char symbol[], const char version[] ) {
-	const char * error;
-
 	union { generic_fptr_t fptr; void * ptr; } originalFunc;
 
 	originalFunc.ptr = dlsym( library, symbol );
-	error = dlerror();
-	if ( error ) abort( "interpose_symbol : internal error, %s\n", error );
-
+	if ( ! originalFunc.ptr ) {								// == nullptr
+		abort( "interpose_symbol : internal error, %s\n", dlerror() );
+	} // if
 	return originalFunc.fptr;
 }
@@ -57,14 +52,12 @@
 	library = RTLD_NEXT;
 	#else
+	// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
 	library = dlopen( "libc.so.6", RTLD_LAZY );
-	if ( ! library ) {
-		const char * error = dlerror();
-		if ( error ) {
-			abort( "interpose_symbol : failed to open libc, %s\n", error );
-		} // if
+	if ( ! library ) {									// == nullptr
+		abort( "interpose_symbol : failed to open libc, %s\n", dlerror() );
 	} // if
-	#endif
-
-	return do_interpose_symbol(library, symbol, version);
+	#endif // RTLD_NEXT
+
+	return do_interpose_symbol( library, symbol, version );
 }
 
Index: libcfa/src/interpose_thread.cfa
===================================================================
--- libcfa/src/interpose_thread.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ libcfa/src/interpose_thread.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -14,17 +14,16 @@
 //
 
-#include <stdarg.h>										// va_start, va_end
-#include <stdio.h>
-#include <string.h>										// strlen
+#ifdef __i386__											// 32-bit architecture
+#undef _GNU_SOURCE
+#endif // __i386__
+
 #include <signal.h>
 #include <pthread.h>
+#include <signal.h>
 extern "C" {
 #include <dlfcn.h>										// dlopen, dlsym
-#include <execinfo.h>									// backtrace, messages
 }
 
-#include "bits/debug.hfa"
 #include "bits/defs.hfa"
-#include <assert.h>
 
 //=============================================================================================
@@ -40,18 +39,16 @@
 ) libcfa_public {
 	void * library;
+
 	#if defined( RTLD_NEXT )
 	library = RTLD_NEXT;
 	#else
 	// missing RTLD_NEXT => must hard-code library name, assuming libstdc++
-	library = dlopen( "libthread_db.so", RTLD_LAZY );
-	if ( ! library ) {
-		const char * error = dlerror();
-		if ( error ) {
-			abort( "interpose_symbol : failed to open libpthread, %s\n", error );
-		}
+	library = dlopen( "libpthread.so", RTLD_LAZY );
+	if ( ! library ) {									// == nullptr
+		abort( "interpose_symbol : failed to open libpthread, %s\n", dlerror() );
 	} // if
 	#endif // RTLD_NEXT
 
-	return do_interpose_symbol(library, symbol, version);
+	return do_interpose_symbol( library, symbol, version );
 }
 
@@ -81,14 +78,14 @@
 #pragma GCC diagnostic push
 #pragma GCC diagnostic ignored "-Wdiscarded-qualifiers"
-		INTERPOSE( pthread_create , version );
-		INTERPOSE( pthread_join , version );
-		INTERPOSE( pthread_self , version );
-		INTERPOSE( pthread_attr_init , version );
-		INTERPOSE( pthread_attr_destroy , version );
-		INTERPOSE( pthread_attr_setstack , version );
-		INTERPOSE( pthread_attr_getstacksize , version );
-		INTERPOSE( pthread_sigmask , version );
-		INTERPOSE( pthread_sigqueue , version );
-		INTERPOSE( pthread_once , version );
+		INTERPOSE( pthread_create, version );
+		INTERPOSE( pthread_join, version );
+		INTERPOSE( pthread_self, version );
+		INTERPOSE( pthread_attr_init, version );
+		INTERPOSE( pthread_attr_destroy, version );
+		INTERPOSE( pthread_attr_setstack, version );
+		INTERPOSE( pthread_attr_getstacksize, version );
+		INTERPOSE( pthread_sigmask, version );
+		INTERPOSE( pthread_sigqueue, version );
+		INTERPOSE( pthread_once, version );
 #pragma GCC diagnostic pop
 	}
Index: src/AST/TranslationUnit.hpp
===================================================================
--- src/AST/TranslationUnit.hpp	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/AST/TranslationUnit.hpp	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -10,6 +10,6 @@
 // Created On       : Tue Jun 11 15:30:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Tue Mar 11 11:19:00 2022
-// Update Count     : 1
+// Last Modified On : Thr Mar  9 16:41:00 2023
+// Update Count     : 2
 //
 
@@ -17,5 +17,5 @@
 
 #include <map>
-#include <vector>
+#include <list>
 
 #include "Fwd.hpp"
@@ -28,7 +28,7 @@
 
 	ptr<Type> sizeType;
-	const FunctionDecl * dereference;
-	const StructDecl * dtorStruct;
-	const FunctionDecl * dtorDestroy;
+	const FunctionDecl * dereference = nullptr;
+	const StructDecl * dtorStruct = nullptr;
+	const FunctionDecl * dtorDestroy = nullptr;
 };
 
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/DeclarationNode.cc	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 12:34:05 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 25 12:15:40 2023
-// Update Count     : 1404
+// Last Modified By : Andrew Beach
+// Last Modified On : Tue Mar 14 11:56:00 2023
+// Update Count     : 1406
 //
 
@@ -41,11 +41,21 @@
 
 // These must harmonize with the corresponding DeclarationNode enumerations.
-const char * DeclarationNode::basicTypeNames[] = { "void", "_Bool", "char", "int", "int128",
-												   "float", "double", "long double", "float80", "float128",
-												   "_float16", "_float32", "_float32x", "_float64", "_float64x", "_float128", "_float128x", "NoBasicTypeNames" };
-const char * DeclarationNode::complexTypeNames[] = { "_Complex", "NoComplexTypeNames", "_Imaginary" }; // Imaginary unsupported => parse, but make invisible and print error message
-const char * DeclarationNode::signednessNames[] = { "signed", "unsigned", "NoSignednessNames" };
-const char * DeclarationNode::lengthNames[] = { "short", "long", "long long", "NoLengthNames" };
-const char * DeclarationNode::builtinTypeNames[] = { "__builtin_va_list", "__auto_type", "zero_t", "one_t", "NoBuiltinTypeNames" };
+const char * DeclarationNode::basicTypeNames[] = {
+	"void", "_Bool", "char", "int", "int128",
+	"float", "double", "long double", "float80", "float128",
+	"_float16", "_float32", "_float32x", "_float64", "_float64x", "_float128", "_float128x", "NoBasicTypeNames"
+};
+const char * DeclarationNode::complexTypeNames[] = {
+	"_Complex", "NoComplexTypeNames", "_Imaginary"
+}; // Imaginary unsupported => parse, but make invisible and print error message
+const char * DeclarationNode::signednessNames[] = {
+	"signed", "unsigned", "NoSignednessNames"
+};
+const char * DeclarationNode::lengthNames[] = {
+	"short", "long", "long long", "NoLengthNames"
+};
+const char * DeclarationNode::builtinTypeNames[] = {
+	"__builtin_va_list", "__auto_type", "zero_t", "one_t", "NoBuiltinTypeNames"
+};
 
 UniqueName DeclarationNode::anonymous( "__anonymous" );
@@ -70,5 +80,5 @@
 	delete variable.initializer;
 
-// 	delete type;
+//	delete type;
 	delete bitfieldWidth;
 
@@ -504,6 +514,7 @@
 			// src is the new item being added and has a single bit
 		} else if ( ! src->storageClasses.is_threadlocal_any() ) { // conflict ?
-			appendError( error, string( "conflicting " ) + Type::StorageClassesNames[storageClasses.ffs()] +
-						 " & " + Type::StorageClassesNames[src->storageClasses.ffs()] );
+			appendError( error, string( "conflicting " )
+				+ Type::StorageClassesNames[storageClasses.ffs()]
+				+ " & " + Type::StorageClassesNames[src->storageClasses.ffs()] );
 			src->storageClasses.reset();				// FIX to preserve invariant of one basic storage specifier
 		} // if
@@ -589,10 +600,10 @@
 	} else {
 		switch ( dst->kind ) {
-		  case TypeData::Unknown:
+		case TypeData::Unknown:
 			src->qualifiers |= dst->qualifiers;
 			dst = src;
 			src = nullptr;
 			break;
-		  case TypeData::Basic:
+		case TypeData::Basic:
 			dst->qualifiers |= src->qualifiers;
 			if ( src->kind != TypeData::Unknown ) {
@@ -622,8 +633,8 @@
 			} // if
 			break;
-		  default:
+		default:
 			switch ( src->kind ) {
-			  case TypeData::Aggregate:
-			  case TypeData::Enum:
+			case TypeData::Aggregate:
+			case TypeData::Enum:
 				dst->base = new TypeData( TypeData::AggregateInst );
 				dst->base->aggInst.aggregate = src;
@@ -634,5 +645,5 @@
 				src = nullptr;
 				break;
-			  default:
+			default:
 				if ( dst->forall ) {
 					dst->forall->appendList( src->forall );
@@ -706,15 +717,15 @@
 DeclarationNode * DeclarationNode::addAssertions( DeclarationNode * assertions ) {
 	if ( variable.tyClass != TypeDecl::NUMBER_OF_KINDS ) {
-	  	if ( variable.assertions ) {
-	  		variable.assertions->appendList( assertions );
-	  	} else {
-	  		variable.assertions = assertions;
-	  	} // if
-	  	return this;
+		if ( variable.assertions ) {
+			variable.assertions->appendList( assertions );
+		} else {
+			variable.assertions = assertions;
+		} // if
+		return this;
 	} // if
 
 	assert( type );
 	switch ( type->kind ) {
-	  case TypeData::Symbolic:
+	case TypeData::Symbolic:
 		if ( type->symbolic.assertions ) {
 			type->symbolic.assertions->appendList( assertions );
@@ -723,5 +734,5 @@
 		} // if
 		break;
-	  default:
+	default:
 		assert( false );
 	} // switch
@@ -822,6 +833,6 @@
 		if ( type ) {
 			switch ( type->kind ) {
-			  case TypeData::Aggregate:
-			  case TypeData::Enum:
+			case TypeData::Aggregate:
+			case TypeData::Enum:
 				p->type->base = new TypeData( TypeData::AggregateInst );
 				p->type->base->aggInst.aggregate = type;
@@ -832,5 +843,5 @@
 				break;
 
-			  default:
+			default:
 				p->type->base = type;
 			} // switch
@@ -854,11 +865,11 @@
 
 DeclarationNode * DeclarationNode::addNewArray( DeclarationNode * a ) {
-  if ( ! a ) return this;
+	if ( ! a ) return this;
 	assert( a->type->kind == TypeData::Array );
 	TypeData * lastArray = findLast( a->type );
 	if ( type ) {
 		switch ( type->kind ) {
-		  case TypeData::Aggregate:
-		  case TypeData::Enum:
+		case TypeData::Aggregate:
+		case TypeData::Enum:
 			lastArray->base = new TypeData( TypeData::AggregateInst );
 			lastArray->base->aggInst.aggregate = type;
@@ -868,5 +879,5 @@
 			lastArray->base->qualifiers |= type->qualifiers;
 			break;
-		  default:
+		default:
 			lastArray->base = type;
 		} // switch
@@ -1204,5 +1215,5 @@
 		} // if
 		bool isDelete = initializer && initializer->get_isDelete();
-		Declaration * decl = buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild< Expression >( bitfieldWidth ), funcSpecs, linkage, asmName, isDelete ? nullptr : maybeBuild< Initializer >(initializer), attributes )->set_extension( extension );
+		Declaration * decl = buildDecl( type, name ? *name : string( "" ), storageClasses, maybeBuild( bitfieldWidth ), funcSpecs, linkage, asmName, isDelete ? nullptr : maybeBuild(initializer), attributes )->set_extension( extension );
 		if ( isDelete ) {
 			DeclarationWithType * dwt = strict_dynamic_cast<DeclarationWithType *>( decl );
@@ -1213,5 +1224,5 @@
 
 	if ( assert.condition ) {
-		return new StaticAssertDecl( maybeBuild< Expression >( assert.condition ), strict_dynamic_cast< ConstantExpr * >( maybeClone( assert.message ) ) );
+		return new StaticAssertDecl( maybeBuild( assert.condition ), strict_dynamic_cast< ConstantExpr * >( maybeClone( assert.message ) ) );
 	}
 
@@ -1227,5 +1238,5 @@
 	} // if
 	assertf( name, "ObjectDecl must a have name\n" );
-	return (new ObjectDecl( *name, storageClasses, linkage, maybeBuild< Expression >( bitfieldWidth ), nullptr, maybeBuild< Initializer >( initializer ) ))->set_asmName( asmName )->set_extension( extension );
+	return (new ObjectDecl( *name, storageClasses, linkage, maybeBuild( bitfieldWidth ), nullptr, maybeBuild( initializer ) ))->set_asmName( asmName )->set_extension( extension );
 }
 
@@ -1234,16 +1245,16 @@
 
 	switch ( type->kind ) {
-	  case TypeData::Enum:
-	  case TypeData::Aggregate: {
-		  ReferenceToType * ret = buildComAggInst( type, attributes, linkage );
-		  buildList( type->aggregate.actuals, ret->get_parameters() );
-		  return ret;
-	  }
-	  case TypeData::Symbolic: {
-		  TypeInstType * ret = new TypeInstType( buildQualifiers( type ), *type->symbolic.name, false, attributes );
-		  buildList( type->symbolic.actuals, ret->get_parameters() );
-		  return ret;
-	  }
-	  default:
+	case TypeData::Enum:
+	case TypeData::Aggregate: {
+		ReferenceToType * ret = buildComAggInst( type, attributes, linkage );
+		buildList( type->aggregate.actuals, ret->get_parameters() );
+		return ret;
+	}
+	case TypeData::Symbolic: {
+		TypeInstType * ret = new TypeInstType( buildQualifiers( type ), *type->symbolic.name, false, attributes );
+		buildList( type->symbolic.actuals, ret->get_parameters() );
+		return ret;
+	}
+	default:
 		Type * simpletypes = typebuild( type );
 		simpletypes->get_attributes() = attributes;		// copy because member is const
Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/ExpressionNode.cc	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -9,7 +9,7 @@
 // Author           : Peter A. Buhr
 // Created On       : Sat May 16 13:17:07 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 11 14:49:00 2023
-// Update Count     : 1079
+// Last Modified By : Andrew Beach
+// Last Modified On : Tue Mar 14 12:00:00 2023
+// Update Count     : 1082
 //
 
@@ -71,5 +71,5 @@
 	size_t end = str.length() - 1;
 	if ( posn == end ) { type = 3; return; }			// no length after 'l' => long
-	
+
 	string::size_type next = posn + 1;					// advance to length
 	if ( str[next] == '3' ) {							// 32
@@ -122,5 +122,5 @@
 		if ( str[i] == '1' ) v |= 1;
 		i += 1;
-	  if ( i == last - 1 || (str[i] != '0' && str[i] != '1') ) break;
+		if ( i == last - 1 || (str[i] != '0' && str[i] != '1') ) break;
 		v <<= 1;
 	} // for
@@ -157,6 +157,4 @@
 	} // if
 
-	string::size_type posn;
-
 	// 'u' can appear before or after length suffix
 	if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;
@@ -166,27 +164,28 @@
 	} else {
 		// At least one digit in integer constant, so safe to backup while looking for suffix.
-
-		posn = str.find_last_of( "pP" );				// pointer value
-		if ( posn != string::npos ) { ltype = 5; str.erase( posn, 1 ); goto FINI; }
-
-		posn = str.find_last_of( "zZ" );				// size_t
-		if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; }
-
-		posn = str.rfind( "hh" );						// signed char
-		if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
-
-		posn = str.rfind( "HH" );						// signed char
-		if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
-
-		posn = str.find_last_of( "hH" );				// short
-		if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }
-
-		posn = str.find_last_of( "nN" );				// int (natural number)
-		if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; }
-
-		if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; }
-
-		lnthSuffix( str, type, ltype );					// must be after check for "ll"
-	  FINI: ;
+		string::size_type posn;
+		// pointer value
+		if ( posn = str.find_last_of( "pP" ); posn != string::npos ) {
+			ltype = 5; str.erase( posn, 1 );
+		// size_t
+		} else if ( posn = str.find_last_of( "zZ" ); posn != string::npos ) {
+			Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 );
+		// signed char
+		} else if ( posn = str.rfind( "hh" ); posn != string::npos ) {
+			type = 1; str.erase( posn, 2 );
+		// signed char
+		} else if ( posn = str.rfind( "HH" ); posn != string::npos ) {
+			type = 1; str.erase( posn, 2 );
+		// short
+		} else if ( posn = str.find_last_of( "hH" ); posn != string::npos ) {
+			type = 0; str.erase( posn, 1 );
+		// int (natural number)
+		} else if ( posn = str.find_last_of( "nN" ); posn != string::npos ) {
+			type = 2; str.erase( posn, 1 );
+		} else if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) {
+			type = 4;
+		} else {
+			lnthSuffix( str, type, ltype );
+		} // if
 	} // if
 
@@ -196,5 +195,5 @@
 	if ( type == 5 ) SemanticError( yylloc, "int128 constant is not supported on this target " + str );
 #endif // ! __SIZEOF_INT128__
-	
+
 	if ( str[0] == '0' ) {								// radix character ?
 		dec = false;
@@ -206,9 +205,10 @@
 				unsigned int len = str.length();
 				if ( len > (2 + 16 + 16) ) SemanticError( yylloc, "128-bit hexadecimal constant to large " + str );
-			  if ( len <= (2 + 16) ) goto FHEX1;		// hex digits < 2^64
-				str2 = "0x" + str.substr( len - 16 );
-				sscanf( (char *)str2.c_str(), "%llx", &v2 );
-				str = str.substr( 0, len - 16 );
-			  FHEX1: ;
+				// hex digits < 2^64
+				if ( len > (2 + 16) ) {
+					str2 = "0x" + str.substr( len - 16 );
+					sscanf( (char *)str2.c_str(), "%llx", &v2 );
+					str = str.substr( 0, len - 16 );
+				} // if
 				sscanf( (char *)str.c_str(), "%llx", &v );
 #endif // __SIZEOF_INT128__
@@ -309,6 +309,7 @@
 //			ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false );
 			ret2 = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::LongLongSignedInt ), str2, v2 ) );
-			ret = build_compoundLiteral( DeclarationNode::newBasicType( DeclarationNode::Int128 )->addType( DeclarationNode::newSignedNess( DeclarationNode::Unsigned ) ),
-										 new InitializerNode( (InitializerNode *)(new InitializerNode( new ExpressionNode( v2 == 0 ? ret2 : ret ) ))->set_last( new InitializerNode( new ExpressionNode( v2 == 0 ? ret : ret2 ) ) ), true ) );
+			ret = build_compoundLiteral(
+				DeclarationNode::newBasicType( DeclarationNode::Int128 )->addType( DeclarationNode::newSignedNess( DeclarationNode::Unsigned ) ),
+				new InitializerNode( (InitializerNode *)(new InitializerNode( new ExpressionNode( v2 == 0 ? ret2 : ret ) ))->set_last( new InitializerNode( new ExpressionNode( v2 == 0 ? ret : ret2 ) ) ), true ) );
 		} else {										// explicit length, (length_type)constant
 			ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][ltype], false ), false );
@@ -435,17 +436,17 @@
 	Type * strtype;
 	switch ( str[0] ) {									// str has >= 2 characters, i.e, null string "" => safe to look at subscripts 0/1
-	  case 'u':
+	case 'u':
 		if ( str[1] == '8' ) goto Default;				// utf-8 characters => array of char
 		// lookup type of associated typedef
 		strtype = new TypeInstType( Type::Qualifiers( ), "char16_t", false );
 		break;
-	  case 'U':
+	case 'U':
 		strtype = new TypeInstType( Type::Qualifiers( ), "char32_t", false );
 		break;
-	  case 'L':
+	case 'L':
 		strtype = new TypeInstType( Type::Qualifiers( ), "wchar_t", false );
 		break;
-	  Default:											// char default string type
-	  default:
+	Default:											// char default string type
+	default:
 		strtype = new BasicType( Type::Qualifiers( ), BasicType::Char );
 	} // switch
@@ -500,5 +501,5 @@
 
 Expression * build_field_name_fraction_constants( Expression * fieldName, ExpressionNode * fracts ) {
-	return make_field_name_fraction_constants( fieldName, maybeMoveBuild< Expression >( fracts ) );
+	return make_field_name_fraction_constants( fieldName, maybeMoveBuild( fracts ) );
 } // build_field_name_fraction_constants
 
@@ -510,5 +511,5 @@
 
 QualifiedNameExpr * build_qualified_expr( const DeclarationNode * decl_node, const NameExpr * name ) {
-	Declaration * newDecl = maybeBuild< Declaration >(decl_node);
+	Declaration * newDecl = maybeBuild(decl_node);
 	if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) {
 		const Type * t = newDeclWithType->get_type();
@@ -548,20 +549,20 @@
 	if ( dynamic_cast< VoidType * >( targetType ) ) {
 		delete targetType;
-		return new CastExpr( maybeMoveBuild< Expression >(expr_node), false );
+		return new CastExpr( maybeMoveBuild( expr_node ), false );
 	} else {
-		return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType, false );
+		return new CastExpr( maybeMoveBuild( expr_node ), targetType, false );
 	} // if
 } // build_cast
 
 Expression * build_keyword_cast( AggregateDecl::Aggregate target, ExpressionNode * expr_node ) {
-	return new KeywordCastExpr( maybeMoveBuild< Expression >(expr_node), target );
+	return new KeywordCastExpr( maybeMoveBuild( expr_node ), target );
 }
 
 Expression * build_virtual_cast( DeclarationNode * decl_node, ExpressionNode * expr_node ) {
-	return new VirtualCastExpr( maybeMoveBuild< Expression >( expr_node ), maybeMoveBuildType( decl_node ) );
+	return new VirtualCastExpr( maybeMoveBuild( expr_node ), maybeMoveBuildType( decl_node ) );
 } // build_virtual_cast
 
 Expression * build_fieldSel( ExpressionNode * expr_node, Expression * member ) {
-	return new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
+	return new UntypedMemberExpr( member, maybeMoveBuild( expr_node ) );
 } // build_fieldSel
 
@@ -569,5 +570,5 @@
 	UntypedExpr * deref = new UntypedExpr( new NameExpr( "*?" ) );
 	deref->location = expr_node->location;
-	deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) );
+	deref->get_args().push_back( maybeMoveBuild( expr_node ) );
 	UntypedMemberExpr * ret = new UntypedMemberExpr( member, deref );
 	return ret;
@@ -581,23 +582,17 @@
 
 Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode * expr_node2, bool kind ) {
-	return new LogicalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), notZeroExpr( maybeMoveBuild< Expression >(expr_node2) ), kind );
+	return new LogicalExpr( notZeroExpr( maybeMoveBuild( expr_node1 ) ), notZeroExpr( maybeMoveBuild( expr_node2 ) ), kind );
 } // build_and_or
 
 Expression * build_unary_val( OperKinds op, ExpressionNode * expr_node ) {
 	list< Expression * > args;
-	args.push_back( maybeMoveBuild< Expression >(expr_node) );
+	args.push_back( maybeMoveBuild( expr_node ) );
 	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
 } // build_unary_val
 
-Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) {
-	list< Expression * > args;
-	args.push_back( maybeMoveBuild< Expression >(expr_node) ); // xxx -- this is exactly the same as the val case now, refactor this code.
-	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
-} // build_unary_ptr
-
 Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
 	list< Expression * > args;
-	args.push_back( maybeMoveBuild< Expression >(expr_node1) );
-	args.push_back( maybeMoveBuild< Expression >(expr_node2) );
+	args.push_back( maybeMoveBuild( expr_node1 ) );
+	args.push_back( maybeMoveBuild( expr_node2 ) );
 	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
 } // build_binary_val
@@ -605,11 +600,11 @@
 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 ) {
 	list< Expression * > args;
-	args.push_back( maybeMoveBuild< Expression >(expr_node1) );
-	args.push_back( maybeMoveBuild< Expression >(expr_node2) );
+	args.push_back( maybeMoveBuild( expr_node1 ) );
+	args.push_back( maybeMoveBuild( expr_node2 ) );
 	return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
 } // build_binary_ptr
 
 Expression * build_cond( ExpressionNode * expr_node1, ExpressionNode * expr_node2, ExpressionNode * expr_node3 ) {
-	return new ConditionalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), maybeMoveBuild< Expression >(expr_node2), maybeMoveBuild< Expression >(expr_node3) );
+	return new ConditionalExpr( notZeroExpr( maybeMoveBuild( expr_node1 ) ), maybeMoveBuild( expr_node2 ), maybeMoveBuild( expr_node3 ) );
 } // build_cond
 
@@ -623,29 +618,29 @@
 	list< Expression * > args;
 	buildMoveList( expr_node, args );
-	return new UntypedExpr( maybeMoveBuild< Expression >(function), args );
+	return new UntypedExpr( maybeMoveBuild( function ), args );
 } // build_func
 
 Expression * build_compoundLiteral( DeclarationNode * decl_node, InitializerNode * kids ) {
-	Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type
+	Declaration * newDecl = maybeBuild( decl_node ); // compound literal type
 	if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type
-		return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeMoveBuild< Initializer >(kids) );
+		return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeMoveBuild( kids ) );
 	// these types do not have associated type information
 	} else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl )  ) {
 		if ( newDeclStructDecl->has_body() ) {
-			return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl ), maybeMoveBuild< Initializer >(kids) );
+			return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl ), maybeMoveBuild( kids ) );
 		} else {
-			return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+			return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeMoveBuild( kids ) );
 		} // if
 	} else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl )  ) {
 		if ( newDeclUnionDecl->has_body() ) {
-			return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl ), maybeMoveBuild< Initializer >(kids) );
+			return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl ), maybeMoveBuild( kids ) );
 		} else {
-			return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+			return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeMoveBuild( kids ) );
 		} // if
 	} else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl )  ) {
 		if ( newDeclEnumDecl->has_body() ) {
-			return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl ), maybeMoveBuild< Initializer >(kids) );
+			return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl ), maybeMoveBuild( kids ) );
 		} else {
-			return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
+			return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeMoveBuild( kids ) );
 		} // if
 	} else {
@@ -656,5 +651,3 @@
 // Local Variables: //
 // tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
 // End: //
Index: src/Parser/InitializerNode.cc
===================================================================
--- src/Parser/InitializerNode.cc	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/InitializerNode.cc	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -102,5 +102,5 @@
 		if ( get_expression() ) {
 			assertf( get_expression()->expr, "The expression of initializer must have value" );
-			return new SingleInit( maybeBuild< Expression >( get_expression() ), maybeConstructed );
+			return new SingleInit( maybeBuild( get_expression() ), maybeConstructed );
 		} // if
 	} // if
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/ParseNode.h	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -137,5 +137,10 @@
 	bool isExpressionType() const {	return nullptr != dynamic_cast<T>(expr.get()); }
 
-	Expression * build() const { return const_cast<ExpressionNode *>(this)->expr.release(); }
+	Expression * build() const {
+		Expression * node = const_cast<ExpressionNode *>(this)->expr.release();
+		node->set_extension( this->get_extension() );
+		node->location = this->location;
+		return node;
+	}
 
 	std::unique_ptr<Expression> expr;					// public because of lifetime implications
@@ -143,18 +148,4 @@
 	bool extension = false;
 }; // ExpressionNode
-
-template< typename T >
-struct maybeBuild_t< Expression, T > {
-	static inline Expression * doit( const T * orig ) {
-		if ( orig ) {
-			Expression * p = orig->build();
-			p->set_extension( orig->get_extension() );
-			p->location = orig->location;
-			return p;
-		} else {
-			return nullptr;
-		} // if
-	}
-};
 
 // Must harmonize with OperName.
@@ -199,5 +190,4 @@
 Expression * build_and_or( ExpressionNode * expr_node1, ExpressionNode * expr_node2, bool kind );
 Expression * build_unary_val( OperKinds op, ExpressionNode * expr_node );
-Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node );
 Expression * build_binary_val( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
 Expression * build_binary_ptr( OperKinds op, ExpressionNode * expr_node1, ExpressionNode * expr_node2 );
@@ -213,7 +203,10 @@
 struct DeclarationNode : public ParseNode {
 	// These enumerations must harmonize with their names in DeclarationNode.cc.
-	enum BasicType { Void, Bool, Char, Int, Int128,
-					 Float, Double, LongDouble, uuFloat80, uuFloat128,
-					 uFloat16, uFloat32, uFloat32x, uFloat64, uFloat64x, uFloat128, uFloat128x, NoBasicType };
+	enum BasicType {
+		Void, Bool, Char, Int, Int128,
+		Float, Double, LongDouble, uuFloat80, uuFloat128,
+		uFloat16, uFloat32, uFloat32x, uFloat64, uFloat64x, uFloat128, uFloat128x,
+		NoBasicType
+	};
 	static const char * basicTypeNames[];
 	enum ComplexType { Complex, NoComplexType, Imaginary };	// Imaginary unsupported => parse, but make invisible and print error message
@@ -401,8 +394,6 @@
 
 struct ForCtrl {
-	ForCtrl( ExpressionNode * expr, ExpressionNode * condition, ExpressionNode * change ) :
-		init( new StatementNode( build_expr( expr ) ) ), condition( condition ), change( change ) {}
-	ForCtrl( DeclarationNode * decl, ExpressionNode * condition, ExpressionNode * change ) :
-		init( new StatementNode( decl ) ), condition( condition ), change( change ) {}
+	ForCtrl( StatementNode * stmt, ExpressionNode * condition, ExpressionNode * change ) :
+		init( stmt ), condition( condition ), change( change ) {}
 
 	StatementNode * init;
@@ -451,5 +442,5 @@
 	while ( cur ) {
 		try {
-			SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild< typename std::pointer_traits< decltype(cur->build())>::element_type >( cur ) );
+			SynTreeType * result = dynamic_cast< SynTreeType * >( maybeBuild( cur ) );
 			if ( result ) {
 				result->location = cur->location;
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/StatementNode.cc	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -38,5 +38,5 @@
 	DeclarationNode * agg = decl->extractAggregate();
 	if ( agg ) {
-		StatementNode * nextStmt = new StatementNode( new DeclStmt( maybeBuild< Declaration >( decl ) ) );
+		StatementNode * nextStmt = new StatementNode( new DeclStmt( maybeBuild( decl ) ) );
 		set_next( nextStmt );
 		if ( decl->get_next() ) {
@@ -51,5 +51,5 @@
 		agg = decl;
 	} // if
-	stmt.reset( new DeclStmt( maybeMoveBuild< Declaration >(agg) ) );
+	stmt.reset( new DeclStmt( maybeMoveBuild( agg ) ) );
 } // StatementNode::StatementNode
 
@@ -73,5 +73,5 @@
 
 Statement * build_expr( ExpressionNode * ctl ) {
-	Expression * e = maybeMoveBuild< Expression >( ctl );
+	Expression * e = maybeMoveBuild( ctl );
 
 	if ( e ) return new ExprStmt( e );
@@ -87,5 +87,5 @@
 	if ( ctl->condition ) {
 		// compare the provided condition against 0
-		cond = notZeroExpr( maybeMoveBuild< Expression >(ctl->condition) );
+		cond = notZeroExpr( maybeMoveBuild( ctl->condition ) );
 	} else {
 		for ( Statement * stmt : init ) {
@@ -134,9 +134,9 @@
 	} // if
 	// aststmt.size() == 0 for switch (...) {}, i.e., no declaration or statements
-	return new SwitchStmt( maybeMoveBuild< Expression >(ctl), aststmt );
+	return new SwitchStmt( maybeMoveBuild( ctl ), aststmt );
 } // build_switch
 
 Statement * build_case( ExpressionNode * ctl ) {
-	return new CaseStmt( maybeMoveBuild< Expression >(ctl), {} ); // stmt starts empty and then added to
+	return new CaseStmt( maybeMoveBuild( ctl ), {} ); // stmt starts empty and then added to
 } // build_case
 
@@ -168,5 +168,5 @@
 
 	// do-while cannot have declarations in the contitional, so init is always empty
-	return new WhileDoStmt( notZeroExpr( maybeMoveBuild< Expression >(ctl) ), aststmt.front(), astelse.front(), {}, true );
+	return new WhileDoStmt( notZeroExpr( maybeMoveBuild( ctl ) ), aststmt.front(), astelse.front(), {}, true );
 } // build_do_while
 
@@ -176,8 +176,8 @@
 
 	Expression * astcond = nullptr;						// maybe empty
-	astcond = notZeroExpr( maybeMoveBuild< Expression >(forctl->condition) );
+	astcond = notZeroExpr( maybeMoveBuild( forctl->condition ) );
 
 	Expression * astincr = nullptr;						// maybe empty
-	astincr = maybeMoveBuild< Expression >(forctl->change);
+	astincr = maybeMoveBuild( forctl->change );
 	delete forctl;
 
@@ -199,10 +199,10 @@
 Statement * build_branch( string * identifier, BranchStmt::Type kind ) {
 	Statement * ret = new BranchStmt( * identifier, kind );
-	delete identifier; 									// allocated by lexer
+	delete identifier;									// allocated by lexer
 	return ret;
 } // build_branch
 
 Statement * build_computedgoto( ExpressionNode * ctl ) {
-	return new BranchStmt( maybeMoveBuild< Expression >(ctl), BranchStmt::Goto );
+	return new BranchStmt( maybeMoveBuild( ctl ), BranchStmt::Goto );
 } // build_computedgoto
 
@@ -236,6 +236,6 @@
 	list< CatchStmt * > aststmt;
 	buildMoveList< CatchStmt, StatementNode >( catch_, aststmt );
-	CompoundStmt * tryBlock = strict_dynamic_cast< CompoundStmt * >(maybeMoveBuild< Statement >(try_));
-	FinallyStmt * finallyBlock = dynamic_cast< FinallyStmt * >(maybeMoveBuild< Statement >(finally_) );
+	CompoundStmt * tryBlock = strict_dynamic_cast< CompoundStmt * >( maybeMoveBuild( try_ ) );
+	FinallyStmt * finallyBlock = dynamic_cast< FinallyStmt * >( maybeMoveBuild( finally_ ) );
 	return new TryStmt( tryBlock, aststmt, finallyBlock );
 } // build_try
@@ -245,5 +245,5 @@
 	buildMoveList< Statement, StatementNode >( body, aststmt );
 	assert( aststmt.size() == 1 );
-	return new CatchStmt( kind, maybeMoveBuild< Declaration >(decl), maybeMoveBuild< Expression >(cond), aststmt.front() );
+	return new CatchStmt( kind, maybeMoveBuild( decl ), maybeMoveBuild( cond ), aststmt.front() );
 } // build_catch
 
@@ -274,5 +274,5 @@
 
 	WaitForStmt::Target target;
-	target.function = maybeBuild<Expression>( targetExpr );
+	target.function = maybeBuild( targetExpr );
 
 	ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
@@ -284,6 +284,6 @@
 	node->clauses.push_back( WaitForStmt::Clause{
 		target,
-		maybeMoveBuild<Statement >( stmt ),
-		notZeroExpr( maybeMoveBuild<Expression>( when ) )
+		maybeMoveBuild( stmt ),
+		notZeroExpr( maybeMoveBuild( when ) )
 	});
 
@@ -293,5 +293,5 @@
 WaitForStmt * build_waitfor( ExpressionNode * targetExpr, StatementNode * stmt, ExpressionNode * when, WaitForStmt * node ) {
 	WaitForStmt::Target target;
-	target.function = maybeBuild<Expression>( targetExpr );
+	target.function = maybeBuild( targetExpr );
 
 	ExpressionNode * next = dynamic_cast<ExpressionNode *>( targetExpr->get_next() );
@@ -303,6 +303,6 @@
 	node->clauses.insert( node->clauses.begin(), WaitForStmt::Clause{
 		std::move( target ),
-		maybeMoveBuild<Statement >( stmt ),
-		notZeroExpr( maybeMoveBuild<Expression>( when ) )
+		maybeMoveBuild( stmt ),
+		notZeroExpr( maybeMoveBuild( when ) )
 	});
 
@@ -314,10 +314,10 @@
 
 	if( timeout ) {
-		node->timeout.time      = maybeMoveBuild<Expression>( timeout );
-		node->timeout.statement = maybeMoveBuild<Statement >( stmt    );
-		node->timeout.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) );
+		node->timeout.time      = maybeMoveBuild( timeout );
+		node->timeout.statement = maybeMoveBuild( stmt    );
+		node->timeout.condition = notZeroExpr( maybeMoveBuild( when ) );
 	} else {
-		node->orelse.statement  = maybeMoveBuild<Statement >( stmt );
-		node->orelse.condition  = notZeroExpr( maybeMoveBuild<Expression>( when ) );
+		node->orelse.statement  = maybeMoveBuild( stmt );
+		node->orelse.condition  = notZeroExpr( maybeMoveBuild( when ) );
 	} // if
 
@@ -328,10 +328,10 @@
 	auto node = new WaitForStmt();
 
-	node->timeout.time      = maybeMoveBuild<Expression>( timeout );
-	node->timeout.statement = maybeMoveBuild<Statement >( stmt    );
-	node->timeout.condition = notZeroExpr( maybeMoveBuild<Expression>( when ) );
-
-	node->orelse.statement  = maybeMoveBuild<Statement >( else_ );
-	node->orelse.condition  = notZeroExpr( maybeMoveBuild<Expression>( else_when ) );
+	node->timeout.time      = maybeMoveBuild( timeout );
+	node->timeout.statement = maybeMoveBuild( stmt    );
+	node->timeout.condition = notZeroExpr( maybeMoveBuild( when ) );
+
+	node->orelse.statement  = maybeMoveBuild( else_ );
+	node->orelse.condition  = notZeroExpr( maybeMoveBuild( else_when ) );
 
 	return node;
@@ -341,5 +341,5 @@
 	list< Expression * > e;
 	buildMoveList( exprs, e );
-	Statement * s = maybeMoveBuild<Statement>( stmt );
+	Statement * s = maybeMoveBuild( stmt );
 	return new DeclStmt( new WithStmt( e, s ) );
 } // build_with
@@ -384,5 +384,5 @@
 	list< Expression * > expList;
 	buildMoveList( exprs, expList );
-	Statement * body = maybeMoveBuild<Statement>( stmt );
+	Statement * body = maybeMoveBuild( stmt );
 	return new MutexStmt( body, expList );
 } // build_mutex
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/TypeData.cc	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -33,22 +33,18 @@
 TypeData::TypeData( Kind k ) : location( yylloc ), kind( k ), base( nullptr ), forall( nullptr ) /*, PTR1( (void*)(0xdeadbeefdeadbeef)), PTR2( (void*)(0xdeadbeefdeadbeef) ) */ {
 	switch ( kind ) {
-	  case Unknown:
-	  case Pointer:
-	  case Reference:
-	  case EnumConstant:
-	  case GlobalScope:
-		// nothing else to initialize
-		break;
-	  case Basic:
-		// basic = new Basic_t;
-		break;
-	  case Array:
-		// array = new Array_t;
+	case Unknown:
+	case Pointer:
+	case Reference:
+	case EnumConstant:
+	case GlobalScope:
+	case Basic:
+		// No unique data to initialize.
+		break;
+	case Array:
 		array.dimension = nullptr;
 		array.isVarLen = false;
 		array.isStatic = false;
 		break;
-	  case Function:
-		// function = new Function_t;
+	case Function:
 		function.params = nullptr;
 		function.idList = nullptr;
@@ -57,7 +53,5 @@
 		function.withExprs = nullptr;
 		break;
-		// Enum is an Aggregate, so both structures are initialized together.
-	  case Enum:
-		// enumeration = new Enumeration_t;
+	case Enum:
 		enumeration.name = nullptr;
 		enumeration.constants = nullptr;
@@ -65,6 +59,5 @@
 		enumeration.anon = false;
 		break;
-	  case Aggregate:
-		// aggregate = new Aggregate_t;
+	case Aggregate:
 		aggregate.kind = AggregateDecl::NoAggregate;
 		aggregate.name = nullptr;
@@ -77,13 +70,11 @@
 		aggregate.anon = false;
 		break;
-	  case AggregateInst:
-		// aggInst = new AggInst_t;
+	case AggregateInst:
 		aggInst.aggregate = nullptr;
 		aggInst.params = nullptr;
 		aggInst.hoistType = false;
 		break;
-	  case Symbolic:
-	  case SymbolicInst:
-		// symbolic = new Symbolic_t;
+	case Symbolic:
+	case SymbolicInst:
 		symbolic.name = nullptr;
 		symbolic.params = nullptr;
@@ -91,18 +82,16 @@
 		symbolic.assertions = nullptr;
 		break;
-	  case Tuple:
-		// tuple = new Tuple_t;
+	case Tuple:
 		tuple = nullptr;
 		break;
-	  case Typeof:
-	  case Basetypeof:
-		// typeexpr = new Typeof_t;
+	case Typeof:
+	case Basetypeof:
 		typeexpr = nullptr;
 		break;
-	  case Vtable:
-		break;
-	  case Builtin:
-		// builtin = new Builtin_t;
-		case Qualified:
+	case Builtin:
+	case Vtable:
+		// No unique data to initialize.
+		break;
+	case Qualified:
 		qualified.parent = nullptr;
 		qualified.child = nullptr;
@@ -117,19 +106,17 @@
 
 	switch ( kind ) {
-	  case Unknown:
-	  case Pointer:
-	  case Reference:
-	  case EnumConstant:
-	  case GlobalScope:
-		// nothing to destroy
-		break;
-	  case Basic:
-		// delete basic;
-		break;
-	  case Array:
+	case Unknown:
+	case Pointer:
+	case Reference:
+	case EnumConstant:
+	case GlobalScope:
+		// No unique data to deconstruct.
+		break;
+	case Basic:
+		break;
+	case Array:
 		delete array.dimension;
-		// delete array;
-		break;
-	  case Function:
+		break;
+	case Function:
 		delete function.params;
 		delete function.idList;
@@ -137,48 +124,41 @@
 		delete function.body;
 		delete function.withExprs;
-		// delete function;
-		break;
-	  case Aggregate:
+		break;
+	case Aggregate:
 		delete aggregate.name;
 		delete aggregate.params;
 		delete aggregate.actuals;
 		delete aggregate.fields;
-		// delete aggregate;
-		break;
-	  case AggregateInst:
+		break;
+	case AggregateInst:
 		delete aggInst.aggregate;
 		delete aggInst.params;
-		// delete aggInst;
-		break;
-	  case Enum:
+		break;
+	case Enum:
 		delete enumeration.name;
 		delete enumeration.constants;
-		// delete enumeration;
-		break;
-	  case Symbolic:
-	  case SymbolicInst:
+		break;
+	case Symbolic:
+	case SymbolicInst:
 		delete symbolic.name;
 		delete symbolic.params;
 		delete symbolic.actuals;
 		delete symbolic.assertions;
-		// delete symbolic;
-		break;
-	  case Tuple:
-		// delete tuple->members;
+		break;
+	case Tuple:
 		delete tuple;
 		break;
-	  case Typeof:
-	  case Basetypeof:
-		// delete typeexpr->expr;
+	case Typeof:
+	case Basetypeof:
 		delete typeexpr;
 		break;
-	  case Vtable:
-		break;
-	  case Builtin:
-		// delete builtin;
-		break;
-	  case Qualified:
+	case Vtable:
+	case Builtin:
+		// No unique data to deconstruct.
+		break;
+	case Qualified:
 		delete qualified.parent;
 		delete qualified.child;
+		break;
 	} // switch
 } // TypeData::~TypeData
@@ -192,12 +172,12 @@
 
 	switch ( kind ) {
-	  case Unknown:
-	  case EnumConstant:
-	  case Pointer:
-	  case Reference:
-	  case GlobalScope:
+	case Unknown:
+	case EnumConstant:
+	case Pointer:
+	case Reference:
+	case GlobalScope:
 		// nothing else to copy
 		break;
-	  case Basic:
+	case Basic:
 		newtype->basictype = basictype;
 		newtype->complextype = complextype;
@@ -205,10 +185,10 @@
 		newtype->length = length;
 		break;
-	  case Array:
+	case Array:
 		newtype->array.dimension = maybeClone( array.dimension );
 		newtype->array.isVarLen = array.isVarLen;
 		newtype->array.isStatic = array.isStatic;
 		break;
-	  case Function:
+	case Function:
 		newtype->function.params = maybeClone( function.params );
 		newtype->function.idList = maybeClone( function.idList );
@@ -217,5 +197,5 @@
 		newtype->function.withExprs = maybeClone( function.withExprs );
 		break;
-	  case Aggregate:
+	case Aggregate:
 		newtype->aggregate.kind = aggregate.kind;
 		newtype->aggregate.name = aggregate.name ? new string( *aggregate.name ) : nullptr;
@@ -228,10 +208,10 @@
 		newtype->aggregate.parent = aggregate.parent ? new string( *aggregate.parent ) : nullptr;
 		break;
-	  case AggregateInst:
+	case AggregateInst:
 		newtype->aggInst.aggregate = maybeClone( aggInst.aggregate );
 		newtype->aggInst.params = maybeClone( aggInst.params );
 		newtype->aggInst.hoistType = aggInst.hoistType;
 		break;
-	  case Enum:
+	case Enum:
 		newtype->enumeration.name = enumeration.name ? new string( *enumeration.name ) : nullptr;
 		newtype->enumeration.constants = maybeClone( enumeration.constants );
@@ -239,6 +219,6 @@
 		newtype->enumeration.anon = enumeration.anon;
 		break;
-	  case Symbolic:
-	  case SymbolicInst:
+	case Symbolic:
+	case SymbolicInst:
 		newtype->symbolic.name = symbolic.name ? new string( *symbolic.name ) : nullptr;
 		newtype->symbolic.params = maybeClone( symbolic.params );
@@ -247,18 +227,18 @@
 		newtype->symbolic.isTypedef = symbolic.isTypedef;
 		break;
-	  case Tuple:
+	case Tuple:
 		newtype->tuple = maybeClone( tuple );
 		break;
-	  case Typeof:
-	  case Basetypeof:
+	case Typeof:
+	case Basetypeof:
 		newtype->typeexpr = maybeClone( typeexpr );
 		break;
-	  case Vtable:
-		break;
-	  case Builtin:
+	case Vtable:
+		break;
+	case Builtin:
 		assert( builtintype == DeclarationNode::Zero || builtintype == DeclarationNode::One );
 		newtype->builtintype = builtintype;
 		break;
-		case Qualified:
+	case Qualified:
 		newtype->qualified.parent = maybeClone( qualified.parent );
 		newtype->qualified.child = maybeClone( qualified.child );
@@ -280,5 +260,5 @@
 
 	switch ( kind ) {
-	  case Basic:
+	case Basic:
 		if ( signedness != DeclarationNode::NoSignedness ) os << DeclarationNode::signednessNames[ signedness ] << " ";
 		if ( length != DeclarationNode::NoLength ) os << DeclarationNode::lengthNames[ length ] << " ";
@@ -286,5 +266,5 @@
 		if ( basictype != DeclarationNode::NoBasicType ) os << DeclarationNode::basicTypeNames[ basictype ] << " ";
 		break;
-	  case Pointer:
+	case Pointer:
 		os << "pointer ";
 		if ( base ) {
@@ -293,5 +273,5 @@
 		} // if
 		break;
-	  case Reference:
+	case Reference:
 		os << "reference ";
 		if ( base ) {
@@ -300,5 +280,5 @@
 		} // if
 		break;
-	  case Array:
+	case Array:
 		if ( array.isStatic ) {
 			os << "static ";
@@ -316,5 +296,5 @@
 		} // if
 		break;
-	  case Function:
+	case Function:
 		os << "function" << endl;
 		if ( function.params ) {
@@ -344,5 +324,5 @@
 		} // if
 		break;
-	  case Aggregate:
+	case Aggregate:
 		os << AggregateDecl::aggrString( aggregate.kind ) << ' ' << *aggregate.name << endl;
 		if ( aggregate.params ) {
@@ -362,5 +342,5 @@
 		} // if
 		break;
-	  case AggregateInst:
+	case AggregateInst:
 		if ( aggInst.aggregate ) {
 			os << "instance of " ;
@@ -374,5 +354,5 @@
 		} // if
 		break;
-	  case Enum:
+	case Enum:
 		os << "enumeration " << *enumeration.name << endl;;
 		if ( enumeration.constants ) {
@@ -388,8 +368,8 @@
 		} // if
 		break;
-	  case EnumConstant:
+	case EnumConstant:
 		os << "enumeration constant ";
 		break;
-	  case Symbolic:
+	case Symbolic:
 		if ( symbolic.isTypedef ) {
 			os << "typedef definition ";
@@ -411,5 +391,5 @@
 		} // if
 		break;
-	  case SymbolicInst:
+	case SymbolicInst:
 		os << *symbolic.name;
 		if ( symbolic.actuals ) {
@@ -419,5 +399,5 @@
 		} // if
 		break;
-	  case Tuple:
+	case Tuple:
 		os << "tuple ";
 		if ( tuple ) {
@@ -426,5 +406,5 @@
 		} // if
 		break;
-	  case Basetypeof:
+	case Basetypeof:
 		os << "base-";
 		#if defined(__GNUC__) && __GNUC__ >= 7
@@ -432,5 +412,5 @@
 		#endif
 		// FALL THROUGH
-	  case Typeof:
+	case Typeof:
 		os << "type-of expression ";
 		if ( typeexpr ) {
@@ -438,21 +418,21 @@
 		} // if
 		break;
-	  case Vtable:
+	case Vtable:
 		os << "vtable";
 		break;
-	  case Builtin:
+	case Builtin:
 		os << DeclarationNode::builtinTypeNames[builtintype];
 		break;
-	  case GlobalScope:
-		break;
-	  case Qualified:
+	case GlobalScope:
+		break;
+	case Qualified:
 		qualified.parent->print( os );
 		os << ".";
 		qualified.child->print( os );
 		break;
-	  case Unknown:
+	case Unknown:
 		os << "entity of unknown type ";
 		break;
-	  default:
+	default:
 		os << "internal error: TypeData::print " << kind << endl;
 		assert( false );
@@ -462,28 +442,28 @@
 const std::string * TypeData::leafName() const {
 	switch ( kind ) {
-	  case Unknown:
-	  case Pointer:
-	  case Reference:
-	  case EnumConstant:
-	  case GlobalScope:
-	  case Array:
-	  case Basic:
-	  case Function:
-	  case AggregateInst:
-	  case Tuple:
-	  case Typeof:
-	  case Basetypeof:
-	  case Builtin:
-	  case Vtable:
+	case Unknown:
+	case Pointer:
+	case Reference:
+	case EnumConstant:
+	case GlobalScope:
+	case Array:
+	case Basic:
+	case Function:
+	case AggregateInst:
+	case Tuple:
+	case Typeof:
+	case Basetypeof:
+	case Builtin:
+	case Vtable:
 		assertf(false, "Tried to get leaf name from kind without a name: %d", kind);
 		break;
-	  case Aggregate:
+	case Aggregate:
 		return aggregate.name;
-	  case Enum:
+	case Enum:
 		return enumeration.name;
-	  case Symbolic:
-	  case SymbolicInst:
+	case Symbolic:
+	case SymbolicInst:
 		return symbolic.name;
-	  case Qualified:
+	case Qualified:
 		return qualified.child->leafName();
 	} // switch
@@ -530,46 +510,46 @@
 	assert( td );
 	switch ( td->kind ) {
-	  case TypeData::Unknown:
+	case TypeData::Unknown:
 		// fill in implicit int
 		return new BasicType( buildQualifiers( td ), BasicType::SignedInt );
-	  case TypeData::Basic:
+	case TypeData::Basic:
 		return buildBasicType( td );
-	  case TypeData::Pointer:
+	case TypeData::Pointer:
 		return buildPointer( td );
-	  case TypeData::Array:
+	case TypeData::Array:
 		return buildArray( td );
-	  case TypeData::Reference:
+	case TypeData::Reference:
 		return buildReference( td );
-	  case TypeData::Function:
+	case TypeData::Function:
 		return buildFunction( td );
-	  case TypeData::AggregateInst:
+	case TypeData::AggregateInst:
 		return buildAggInst( td );
-	  case TypeData::EnumConstant:
+	case TypeData::EnumConstant:
 		return new EnumInstType( buildQualifiers( td ), "" );
-	  case TypeData::SymbolicInst:
+	case TypeData::SymbolicInst:
 		return buildSymbolicInst( td );
-	  case TypeData::Tuple:
+	case TypeData::Tuple:
 		return buildTuple( td );
-	  case TypeData::Typeof:
-	  case TypeData::Basetypeof:
+	case TypeData::Typeof:
+	case TypeData::Basetypeof:
 		return buildTypeof( td );
-	  case TypeData::Vtable:
+	case TypeData::Vtable:
 		return buildVtable( td );
-	  case TypeData::Builtin:
+	case TypeData::Builtin:
 		switch ( td->builtintype ) {
-		  case DeclarationNode::Zero:
+		case DeclarationNode::Zero:
 			return new ZeroType( noQualifiers );
-		  case DeclarationNode::One:
+		case DeclarationNode::One:
 			return new OneType( noQualifiers );
-		  default:
+		default:
 			return new VarArgsType( buildQualifiers( td ) );
 		} // switch
-	  case TypeData::GlobalScope:
+	case TypeData::GlobalScope:
 		return new GlobalScopeType();
-	  case TypeData::Qualified:
+	case TypeData::Qualified:
 		return new QualifiedType( buildQualifiers( td ), typebuild( td->qualified.parent ), typebuild( td->qualified.child ) );
-	  case TypeData::Symbolic:
-	  case TypeData::Enum:
-	  case TypeData::Aggregate:
+	case TypeData::Symbolic:
+	case TypeData::Enum:
+	case TypeData::Aggregate:
 		assert( false );
 	} // switch
@@ -583,20 +563,20 @@
 
 	switch ( td->kind ) {
-	  case TypeData::Aggregate:
+	case TypeData::Aggregate:
 		if ( ! toplevel && td->aggregate.body ) {
 			ret = td->clone();
 		} // if
 		break;
-	  case TypeData::Enum:
+	case TypeData::Enum:
 		if ( ! toplevel && td->enumeration.body ) {
 			ret = td->clone();
 		} // if
 		break;
-	  case TypeData::AggregateInst:
+	case TypeData::AggregateInst:
 		if ( td->aggInst.aggregate ) {
 			ret = typeextractAggregate( td->aggInst.aggregate, false );
 		} // if
 		break;
-	  default:
+	default:
 		if ( td->base ) {
 			ret = typeextractAggregate( td->base, false );
@@ -620,5 +600,5 @@
 
 	switch ( td->basictype ) {
-	  case DeclarationNode::Void:
+	case DeclarationNode::Void:
 		if ( td->signedness != DeclarationNode::NoSignedness ) {
 			genTSError( DeclarationNode::signednessNames[ td->signedness ], td->basictype );
@@ -630,5 +610,5 @@
 		break;
 
-	  case DeclarationNode::Bool:
+	case DeclarationNode::Bool:
 		if ( td->signedness != DeclarationNode::NoSignedness ) {
 			genTSError( DeclarationNode::signednessNames[ td->signedness ], td->basictype );
@@ -641,5 +621,5 @@
 		break;
 
-	  case DeclarationNode::Char:
+	case DeclarationNode::Char:
 		// C11 Standard 6.2.5.15: The three types char, signed char, and unsigned char are collectively called the
 		// character types. The implementation shall define char to have the same range, representation, and behavior as
@@ -654,5 +634,5 @@
 		break;
 
-	  case DeclarationNode::Int:
+	case DeclarationNode::Int:
 		static BasicType::Kind inttype[2][4] = {
 			{ BasicType::ShortSignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, BasicType::SignedInt },
@@ -660,5 +640,5 @@
 		};
 
-	  Integral: ;
+	Integral: ;
 		if ( td->signedness == DeclarationNode::NoSignedness ) {
 			const_cast<TypeData *>(td)->signedness = DeclarationNode::Signed;
@@ -667,5 +647,5 @@
 		break;
 
-	  case DeclarationNode::Int128:
+	case DeclarationNode::Int128:
 		ret = td->signedness == DeclarationNode::Unsigned ? BasicType::UnsignedInt128 : BasicType::SignedInt128;
 		if ( td->length != DeclarationNode::NoLength ) {
@@ -674,16 +654,16 @@
 		break;
 
-	  case DeclarationNode::Float:
-	  case DeclarationNode::Double:
-	  case DeclarationNode::LongDouble:					// not set until below
-	  case DeclarationNode::uuFloat80:
-	  case DeclarationNode::uuFloat128:
-	  case DeclarationNode::uFloat16:
-	  case DeclarationNode::uFloat32:
-	  case DeclarationNode::uFloat32x:
-	  case DeclarationNode::uFloat64:
-	  case DeclarationNode::uFloat64x:
-	  case DeclarationNode::uFloat128:
-	  case DeclarationNode::uFloat128x:
+	case DeclarationNode::Float:
+	case DeclarationNode::Double:
+	case DeclarationNode::LongDouble:					// not set until below
+	case DeclarationNode::uuFloat80:
+	case DeclarationNode::uuFloat128:
+	case DeclarationNode::uFloat16:
+	case DeclarationNode::uFloat32:
+	case DeclarationNode::uFloat32x:
+	case DeclarationNode::uFloat64:
+	case DeclarationNode::uFloat64x:
+	case DeclarationNode::uFloat128:
+	case DeclarationNode::uFloat128x:
 		static BasicType::Kind floattype[2][12] = {
 			{ BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex, (BasicType::Kind)-1, (BasicType::Kind)-1, BasicType::uFloat16Complex, BasicType::uFloat32Complex, BasicType::uFloat32xComplex, BasicType::uFloat64Complex, BasicType::uFloat64xComplex, BasicType::uFloat128Complex, BasicType::uFloat128xComplex, },
@@ -691,5 +671,5 @@
 		};
 
-	  FloatingPoint: ;
+	FloatingPoint: ;
 		if ( td->signedness != DeclarationNode::NoSignedness ) {
 			genTSError( DeclarationNode::signednessNames[ td->signedness ], td->basictype );
@@ -715,5 +695,5 @@
 		break;
 
-	  case DeclarationNode::NoBasicType:
+	case DeclarationNode::NoBasicType:
 		// No basic type in declaration => default double for Complex/Imaginary and int type for integral types
 		if ( td->complextype == DeclarationNode::Complex || td->complextype == DeclarationNode::Imaginary ) {
@@ -724,6 +704,6 @@
 		const_cast<TypeData *>(td)->basictype = DeclarationNode::Int;
 		goto Integral;
-	  default:
-	  	assertf( false, "unknown basic type" );
+	default:
+		assertf( false, "unknown basic type" );
 		return nullptr;
 	} // switch
@@ -750,9 +730,9 @@
 	ArrayType * at;
 	if ( td->base ) {
-		at = new ArrayType( buildQualifiers( td ), typebuild( td->base ), maybeBuild< Expression >( td->array.dimension ),
+		at = new ArrayType( buildQualifiers( td ), typebuild( td->base ), maybeBuild( td->array.dimension ),
 							td->array.isVarLen, td->array.isStatic );
 	} else {
 		at = new ArrayType( buildQualifiers( td ), new BasicType( Type::Qualifiers(), BasicType::SignedInt ),
-							maybeBuild< Expression >( td->array.dimension ), td->array.isVarLen, td->array.isStatic );
+							maybeBuild( td->array.dimension ), td->array.isVarLen, td->array.isStatic );
 	} // if
 	buildForall( td->forall, at->get_forall() );
@@ -777,22 +757,22 @@
 	AggregateDecl * at;
 	switch ( td->aggregate.kind ) {
-	  case AggregateDecl::Struct:
-	  case AggregateDecl::Coroutine:
-	  case AggregateDecl::Exception:
-	  case AggregateDecl::Generator:
-	  case AggregateDecl::Monitor:
-	  case AggregateDecl::Thread:
+	case AggregateDecl::Struct:
+	case AggregateDecl::Coroutine:
+	case AggregateDecl::Exception:
+	case AggregateDecl::Generator:
+	case AggregateDecl::Monitor:
+	case AggregateDecl::Thread:
 		at = new StructDecl( *td->aggregate.name, td->aggregate.kind, attributes, linkage );
 		buildForall( td->aggregate.params, at->get_parameters() );
 		break;
-	  case AggregateDecl::Union:
+	case AggregateDecl::Union:
 		at = new UnionDecl( *td->aggregate.name, attributes, linkage );
 		buildForall( td->aggregate.params, at->get_parameters() );
 		break;
-	  case AggregateDecl::Trait:
+	case AggregateDecl::Trait:
 		at = new TraitDecl( *td->aggregate.name, attributes, linkage );
 		buildList( td->aggregate.params, at->get_parameters() );
 		break;
-	  default:
+	default:
 		assert( false );
 	} // switch
@@ -807,54 +787,46 @@
 ReferenceToType * buildComAggInst( const TypeData * type, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
 	switch ( type->kind ) {
-	  case TypeData::Enum: {
-		  if ( type->enumeration.body ) {
-			  EnumDecl * typedecl = buildEnum( type, attributes, linkage );
-			  return new EnumInstType( buildQualifiers( type ), typedecl );
-		  } else {
-			  return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
-		  } // if
-	  }
-	  case TypeData::Aggregate: {
-		  ReferenceToType * ret;
-		  if ( type->aggregate.body ) {
-			  AggregateDecl * typedecl = buildAggregate( type, attributes, linkage );
-			  switch ( type->aggregate.kind ) {
-				case AggregateDecl::Struct:
-				case AggregateDecl::Coroutine:
-				case AggregateDecl::Monitor:
-				case AggregateDecl::Thread:
-				  ret = new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
-				  break;
-				case AggregateDecl::Union:
-				  ret = new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
-				  break;
-				case AggregateDecl::Trait:
-				  assert( false );
-				  //ret = new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
-				  break;
-				default:
-				  assert( false );
-			  } // switch
-		  } else {
-			  switch ( type->aggregate.kind ) {
-				case AggregateDecl::Struct:
-				case AggregateDecl::Coroutine:
-				case AggregateDecl::Monitor:
-				case AggregateDecl::Thread:
-				  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
-				  break;
-				case AggregateDecl::Union:
-				  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
-				  break;
-				case AggregateDecl::Trait:
-				  ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
-				  break;
-				default:
-				  assert( false );
-			  } // switch
-		  } // if
-		  return ret;
-	  }
-	  default:
+	case TypeData::Enum:
+		if ( type->enumeration.body ) {
+			EnumDecl * typedecl = buildEnum( type, attributes, linkage );
+			return new EnumInstType( buildQualifiers( type ), typedecl );
+		} else {
+			return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
+		} // if
+	case TypeData::Aggregate:
+		if ( type->aggregate.body ) {
+			AggregateDecl * typedecl = buildAggregate( type, attributes, linkage );
+			switch ( type->aggregate.kind ) {
+			case AggregateDecl::Struct:
+			case AggregateDecl::Coroutine:
+			case AggregateDecl::Monitor:
+			case AggregateDecl::Thread:
+				return new StructInstType( buildQualifiers( type ), (StructDecl *)typedecl );
+			case AggregateDecl::Union:
+				return new UnionInstType( buildQualifiers( type ), (UnionDecl *)typedecl );
+			case AggregateDecl::Trait:
+				assert( false );
+				//return new TraitInstType( buildQualifiers( type ), (TraitDecl *)typedecl );
+				break;
+			default:
+				assert( false );
+			} // switch
+		} else {
+			switch ( type->aggregate.kind ) {
+			case AggregateDecl::Struct:
+			case AggregateDecl::Coroutine:
+			case AggregateDecl::Monitor:
+			case AggregateDecl::Thread:
+				return new StructInstType( buildQualifiers( type ), *type->aggregate.name );
+			case AggregateDecl::Union:
+				return new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
+			case AggregateDecl::Trait:
+				return new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
+			default:
+				assert( false );
+			} // switch
+		} // if
+		return nullptr;
+	default:
 		assert( false );
 	} // switch
@@ -869,27 +841,25 @@
 	TypeData * type = td->aggInst.aggregate;
 	switch ( type->kind ) {
-	  case TypeData::Enum: {
-		  return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
-	  }
-	  case TypeData::Aggregate: {
-		  switch ( type->aggregate.kind ) {
-			case AggregateDecl::Struct:
-			case AggregateDecl::Coroutine:
-			case AggregateDecl::Monitor:
-			case AggregateDecl::Thread:
-			  ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
-			  break;
-			case AggregateDecl::Union:
-			  ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
-			  break;
-			case AggregateDecl::Trait:
-			  ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
-			  break;
-			default:
-			  assert( false );
-		  } // switch
-	  }
-	  break;
-	  default:
+	case TypeData::Enum:
+		return new EnumInstType( buildQualifiers( type ), *type->enumeration.name );
+	case TypeData::Aggregate:
+		switch ( type->aggregate.kind ) {
+		case AggregateDecl::Struct:
+		case AggregateDecl::Coroutine:
+		case AggregateDecl::Monitor:
+		case AggregateDecl::Thread:
+			ret = new StructInstType( buildQualifiers( type ), *type->aggregate.name );
+			break;
+		case AggregateDecl::Union:
+			ret = new UnionInstType( buildQualifiers( type ), *type->aggregate.name );
+			break;
+		case AggregateDecl::Trait:
+			ret = new TraitInstType( buildQualifiers( type ), *type->aggregate.name );
+			break;
+		default:
+			assert( false );
+		} // switch
+		break;
+	default:
 		assert( false );
 	} // switch
@@ -931,5 +901,5 @@
 		} else if ( cur->has_enumeratorValue() ) {
 			ObjectDecl * member = dynamic_cast< ObjectDecl * >(* members);
-			member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ) ) );
+			member->set_init( new SingleInit( maybeMoveBuild( cur->consume_enumeratorValue() ) ) );
 		} else if ( !cur->initializer ) {
 			if ( baseType && (!dynamic_cast<BasicType *>(baseType) || !dynamic_cast<BasicType *>(baseType)->isInteger())) {
@@ -985,5 +955,5 @@
 
 		FunctionDecl * decl;
-		Statement * stmt = maybeBuild<Statement>( td->function.body );
+		Statement * stmt = maybeBuild( td->function.body );
 		CompoundStmt * body = dynamic_cast< CompoundStmt * >( stmt );
 		decl = new FunctionDecl( name, scs, linkage, buildFunction( td ), body, attributes, funcSpec );
@@ -1010,8 +980,8 @@
 	if ( td->base ) {
 		switch ( td->base->kind ) {
-		  case TypeData::Tuple:
+		case TypeData::Tuple:
 			buildList( td->base->tuple, ft->returnVals );
 			break;
-		  default:
+		default:
 			ft->get_returnVals().push_back( dynamic_cast< DeclarationWithType * >( buildDecl( td->base, "", Type::StorageClasses(), nullptr, Type::FuncSpecifiers(), LinkageSpec::Cforall, nullptr ) ) );
 		} // switch
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/TypeData.h	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -130,6 +130,8 @@
 TypeofType * buildTypeof( const TypeData * );
 VTableType * buildVtable( const TypeData * );
-Declaration * buildDecl( const TypeData *, const std::string &, Type::StorageClasses, Expression *, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec, Expression * asmName,
-						 Initializer * init = nullptr, std::list< class Attribute * > attributes = std::list< class Attribute * >() );
+Declaration * buildDecl(
+	const TypeData *, const std::string &, Type::StorageClasses, Expression *,
+	Type::FuncSpecifiers funcSpec, LinkageSpec::Spec, Expression * asmName,
+	Initializer * init = nullptr, std::list< class Attribute * > attributes = std::list< class Attribute * >() );
 FunctionType * buildFunction( const TypeData * );
 Declaration * addEnumBase( Declaration *, const TypeData * );
Index: src/Parser/TypedefTable.cc
===================================================================
--- src/Parser/TypedefTable.cc	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/TypedefTable.cc	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -31,9 +31,9 @@
 	static const char *kindName( int kind ) {
 		switch ( kind ) {
-		  case IDENTIFIER: return "identifier";
-		  case TYPEDIMname: return "typedim";
-		  case TYPEDEFname: return "typedef";
-		  case TYPEGENname: return "typegen";
-		  default:
+		case IDENTIFIER: return "identifier";
+		case TYPEDIMname: return "typedim";
+		case TYPEDEFname: return "typedef";
+		case TYPEGENname: return "typegen";
+		default:
 			cerr << "Error: cfa-cpp internal error, invalid kind of identifier" << endl;
 			abort();
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/parser.yy	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Feb 25 13:23:16 2023
-// Update Count     : 5989
+// Last Modified On : Tue Mar 14 09:37:58 2023
+// Update Count     : 5990
 //
 
@@ -206,4 +206,23 @@
 #define MISSING_HIGH "Missing high value for down-to range so index is uninitialized."
 
+static ForCtrl * makeForCtrl(
+		DeclarationNode * init,
+		enum OperKinds compop,
+		ExpressionNode * comp,
+		ExpressionNode * inc ) {
+	// Wrap both comp/inc if they are non-null.
+	if ( comp ) comp = new ExpressionNode( build_binary_val(
+		compop,
+		new ExpressionNode( build_varref( new string( *init->name ) ) ),
+		comp ) );
+	if ( inc ) inc = new ExpressionNode( build_binary_val(
+		// choose += or -= for upto/downto
+		compop == OperKinds::LThan || compop == OperKinds::LEThan ? OperKinds::PlusAssn : OperKinds::MinusAssn,
+		new ExpressionNode( build_varref( new string( *init->name ) ) ),
+		inc ) );
+	// The StatementNode call frees init->name, it must happen later.
+	return new ForCtrl( new StatementNode( init ), comp, inc );
+}
+
 ForCtrl * forCtrl( DeclarationNode * index, ExpressionNode * start, enum OperKinds compop, ExpressionNode * comp, ExpressionNode * inc ) {
 	if ( index->initializer ) {
@@ -213,9 +232,6 @@
 		SemanticError( yylloc, "Multiple loop indexes disallowed in for-loop declaration." );
 	} // if
-	return new ForCtrl( index->addInitializer( new InitializerNode( start ) ),
-		// NULL comp/inc => leave blank
-		comp ? new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index->name ) ) ), comp ) ) : nullptr,
-		inc ? new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
-							OperKinds::PlusAssn : OperKinds::MinusAssn, new ExpressionNode( build_varref( new string( *index->name ) ) ), inc ) ) : nullptr );
+	DeclarationNode * initDecl = index->addInitializer( new InitializerNode( start ) );
+	return makeForCtrl( initDecl, compop, comp, inc );
 } // forCtrl
 
@@ -223,13 +239,11 @@
 	ConstantExpr * constant = dynamic_cast<ConstantExpr *>(type->expr.get());
 	if ( constant && (constant->get_constant()->get_value() == "0" || constant->get_constant()->get_value() == "1") ) {
-		type = new ExpressionNode( new CastExpr( maybeMoveBuild<Expression>(type), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ) );
+		type = new ExpressionNode( new CastExpr( maybeMoveBuild( type ), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) ) );
 	} // if
-//	type = new ExpressionNode( build_func( new ExpressionNode( build_varref( new string( "__for_control_index_constraints__" ) ) ), type ) );
-	return new ForCtrl(
-		distAttr( DeclarationNode::newTypeof( type, true ), DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) ) ),
-		// NULL comp/inc => leave blank
-		comp ? new ExpressionNode( build_binary_val( compop, new ExpressionNode( build_varref( new string( *index ) ) ), comp ) ) : nullptr,
-		inc ? new ExpressionNode( build_binary_val( compop == OperKinds::LThan || compop == OperKinds::LEThan ? // choose += or -= for upto/downto
-							OperKinds::PlusAssn : OperKinds::MinusAssn, new ExpressionNode( build_varref( new string( *index ) ) ), inc ) ) : nullptr );
+	DeclarationNode * initDecl = distAttr(
+		DeclarationNode::newTypeof( type, true ),
+		DeclarationNode::newName( index )->addInitializer( new InitializerNode( start ) )
+	);
+	return makeForCtrl( initDecl, compop, comp, inc );
 } // forCtrl
 
@@ -649,5 +663,5 @@
 		{ $$ = $2; }
 	| '(' compound_statement ')'						// GCC, lambda expression
-		{ $$ = new ExpressionNode( new StmtExpr( dynamic_cast<CompoundStmt *>(maybeMoveBuild<Statement>($2) ) ) ); }
+		{ $$ = new ExpressionNode( new StmtExpr( dynamic_cast<CompoundStmt *>(maybeMoveBuild( $2 ) ) ) ); }
 	| type_name '.' identifier							// CFA, nested type
 		{ $$ = new ExpressionNode( build_qualified_expr( $1, build_varref( $3 ) ) ); }
@@ -657,5 +671,5 @@
 		{
 			// add the missing control expression to the GenericExpr and return it
-			$5->control = maybeMoveBuild<Expression>( $3 );
+			$5->control = maybeMoveBuild( $3 );
 			$$ = new ExpressionNode( $5 );
 		}
@@ -693,8 +707,8 @@
 		{
 			// create a GenericExpr wrapper with one association pair
-			$$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild<Expression>( $3 ) } } );
+			$$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild( $3 ) } } );
 		}
 	| DEFAULT ':' assignment_expression
-		{ $$ = new GenericExpr( nullptr, { { maybeMoveBuild<Expression>( $3 ) } } ); }
+		{ $$ = new GenericExpr( nullptr, { { maybeMoveBuild( $3 ) } } ); }
 	;
 
@@ -751,7 +765,7 @@
 		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $4 ) ) ); }
 	| postfix_expression ICR
-	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::IncrPost, $1 ) ); }
+	  	{ $$ = new ExpressionNode( build_unary_val( OperKinds::IncrPost, $1 ) ); }
 	| postfix_expression DECR
-	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::DecrPost, $1 ) ); }
+	  	{ $$ = new ExpressionNode( build_unary_val( OperKinds::DecrPost, $1 ) ); }
 	| '(' type_no_function ')' '{' initializer_list_opt comma_opt '}' // C99, compound-literal
 		{ $$ = new ExpressionNode( build_compoundLiteral( $2, new InitializerNode( $5, true ) ) ); }
@@ -793,13 +807,13 @@
 	field_name
 	| FLOATING_DECIMALconstant field
-		{ $$ = new ExpressionNode( build_fieldSel( new ExpressionNode( build_field_name_FLOATING_DECIMALconstant( *$1 ) ), maybeMoveBuild<Expression>( $2 ) ) ); }
+		{ $$ = new ExpressionNode( build_fieldSel( new ExpressionNode( build_field_name_FLOATING_DECIMALconstant( *$1 ) ), maybeMoveBuild( $2 ) ) ); }
 	| FLOATING_DECIMALconstant '[' field_name_list ']'
 		{ $$ = new ExpressionNode( build_fieldSel( new ExpressionNode( build_field_name_FLOATING_DECIMALconstant( *$1 ) ), build_tuple( $3 ) ) ); }
 	| field_name '.' field
-		{ $$ = new ExpressionNode( build_fieldSel( $1, maybeMoveBuild<Expression>( $3 ) ) ); }
+		{ $$ = new ExpressionNode( build_fieldSel( $1, maybeMoveBuild( $3 ) ) ); }
 	| field_name '.' '[' field_name_list ']'
 		{ $$ = new ExpressionNode( build_fieldSel( $1, build_tuple( $4 ) ) ); }
 	| field_name ARROW field
-		{ $$ = new ExpressionNode( build_pfieldSel( $1, maybeMoveBuild<Expression>( $3 ) ) ); }
+		{ $$ = new ExpressionNode( build_pfieldSel( $1, maybeMoveBuild( $3 ) ) ); }
 	| field_name ARROW '[' field_name_list ']'
 		{ $$ = new ExpressionNode( build_pfieldSel( $1, build_tuple( $4 ) ) ); }
@@ -843,5 +857,5 @@
 			switch ( $1 ) {
 			  case OperKinds::AddressOf:
-				$$ = new ExpressionNode( new AddressExpr( maybeMoveBuild<Expression>( $2 ) ) );
+				$$ = new ExpressionNode( new AddressExpr( maybeMoveBuild( $2 ) ) );
 				break;
 			  case OperKinds::PointTo:
@@ -849,5 +863,5 @@
 				break;
 			  case OperKinds::And:
-				$$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild<Expression>( $2 ) ) ) );
+				$$ = new ExpressionNode( new AddressExpr( new AddressExpr( maybeMoveBuild( $2 ) ) ) );
 				break;
 			  default:
@@ -858,13 +872,13 @@
 	  	{ $$ = new ExpressionNode( build_unary_val( $1, $2 ) ); }
 	| ICR unary_expression
-	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::Incr, $2 ) ); }
+	  	{ $$ = new ExpressionNode( build_unary_val( OperKinds::Incr, $2 ) ); }
 	| DECR unary_expression
-	  	{ $$ = new ExpressionNode( build_unary_ptr( OperKinds::Decr, $2 ) ); }
+	  	{ $$ = new ExpressionNode( build_unary_val( OperKinds::Decr, $2 ) ); }
 	| SIZEOF unary_expression
-		{ $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild<Expression>( $2 ) ) ); }
+		{ $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuild( $2 ) ) ); }
 	| SIZEOF '(' type_no_function ')'
 		{ $$ = new ExpressionNode( new SizeofExpr( maybeMoveBuildType( $3 ) ) ); }
 	| ALIGNOF unary_expression							// GCC, variable alignment
-		{ $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild<Expression>( $2 ) ) ); }
+		{ $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuild( $2 ) ) ); }
 	| ALIGNOF '(' type_no_function ')'					// GCC, type alignment
 		{ $$ = new ExpressionNode( new AlignofExpr( maybeMoveBuildType( $3 ) ) ); }
@@ -901,7 +915,7 @@
 		{ $$ = new ExpressionNode( build_keyword_cast( $2, $5 ) ); }
 	| '(' VIRTUAL ')' cast_expression					// CFA
-		{ $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild<Expression>( $4 ), maybeMoveBuildType( nullptr ) ) ); }
+		{ $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild( $4 ), maybeMoveBuildType( nullptr ) ) ); }
 	| '(' VIRTUAL type_no_function ')' cast_expression	// CFA
-		{ $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild<Expression>( $5 ), maybeMoveBuildType( $3 ) ) ); }
+		{ $$ = new ExpressionNode( new VirtualCastExpr( maybeMoveBuild( $5 ), maybeMoveBuildType( $3 ) ) ); }
 	| '(' RETURN type_no_function ')' cast_expression	// CFA
 		{ SemanticError( yylloc, "Return cast is currently unimplemented." ); $$ = nullptr; }
@@ -1092,5 +1106,5 @@
 	assignment_expression
 	| comma_expression ',' assignment_expression
-		{ $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild<Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); }
+		{ $$ = new ExpressionNode( new CommaExpr( maybeMoveBuild( $1 ), maybeMoveBuild( $3 ) ) ); }
 	;
 
@@ -1230,5 +1244,5 @@
 	constant_expression							{ $$ = $1; }
 	| constant_expression ELLIPSIS constant_expression	// GCC, subrange
-		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild<Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); }
+		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild( $1 ), maybeMoveBuild( $3 ) ) ); }
 	| subrange											// CFA, subrange
 	;
@@ -1298,8 +1312,8 @@
 		{ $$ = new StatementNode( build_do_while( $5, maybe_build_compound( $2 ), $8 ) ); }
 	| FOR '(' ')' statement								%prec THEN // CFA => for ( ;; )
-		{ $$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) ); }
+		{ $$ = new StatementNode( build_for( new ForCtrl( nullptr, nullptr, nullptr ), maybe_build_compound( $4 ) ) ); }
 	| FOR '(' ')' statement ELSE statement				// CFA
 		{
-			$$ = new StatementNode( build_for( new ForCtrl( (ExpressionNode * )nullptr, (ExpressionNode * )nullptr, (ExpressionNode * )nullptr ), maybe_build_compound( $4 ) ) );
+			$$ = new StatementNode( build_for( new ForCtrl( nullptr, nullptr, nullptr ), maybe_build_compound( $4 ) ) );
 			SemanticWarning( yylloc, Warning::SuperfluousElse );
 		}
@@ -1335,14 +1349,17 @@
 for_control_expression:
 	';' comma_expression_opt ';' comma_expression_opt
-		{ $$ = new ForCtrl( (ExpressionNode * )nullptr, $2, $4 ); }
+		{ $$ = new ForCtrl( nullptr, $2, $4 ); }
 	| comma_expression ';' comma_expression_opt ';' comma_expression_opt
-		{ $$ = new ForCtrl( $1, $3, $5 ); }
+		{
+			StatementNode * init = $1 ? new StatementNode( new ExprStmt( maybeMoveBuild( $1 ) ) ) : nullptr;
+			$$ = new ForCtrl( init, $3, $5 );
+		}
 	| declaration comma_expression_opt ';' comma_expression_opt // C99, declaration has ';'
-		{ $$ = new ForCtrl( $1, $2, $4 ); }
+		{ $$ = new ForCtrl( new StatementNode( $1 ), $2, $4 ); }
 
 	| '@' ';' comma_expression							// CFA, empty loop-index
-		{ $$ = new ForCtrl( (ExpressionNode *)nullptr, $3, nullptr ); }
+		{ $$ = new ForCtrl( nullptr, $3, nullptr ); }
 	| '@' ';' comma_expression ';' comma_expression		// CFA, empty loop-index
-		{ $$ = new ForCtrl( (ExpressionNode *)nullptr, $3, $5 ); }
+		{ $$ = new ForCtrl( nullptr, $3, $5 ); }
 
 	| comma_expression									// CFA, anonymous loop-index
@@ -1732,7 +1749,7 @@
 asm_operand:											// GCC
 	string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild<Expression>( $3 ) ) ); }
+		{ $$ = new ExpressionNode( new AsmExpr( nullptr, $1, maybeMoveBuild( $3 ) ) ); }
 	| '[' IDENTIFIER ']' string_literal '(' constant_expression ')'
-		{ $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild<Expression>( $6 ) ) ); }
+		{ $$ = new ExpressionNode( new AsmExpr( $2, $4, maybeMoveBuild( $6 ) ) ); }
 	;
 
@@ -2038,10 +2055,4 @@
 	basic_type_specifier
 	| sue_type_specifier
-		{
-			// printf( "sue_type_specifier2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
-		  	// for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
-			//   printf( "\tattr %s\n", attr->name.c_str() );
-			// } // for
-		}
 	| type_type_specifier
 	;
@@ -2383,14 +2394,5 @@
 	  '{' field_declaration_list_opt '}' type_parameters_opt
 		{
-			// printf( "aggregate_type1 %s\n", $3.str->c_str() );
-			// if ( $2 )
-			// 	for ( Attribute * attr: reverseIterate( $2->attributes ) ) {
-			// 		printf( "copySpecifiers12 %s\n", attr->name.c_str() );
-			// 	} // for
 			$$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 );
-			// printf( "aggregate_type2 %p %s\n", $$, $$->type->aggregate.name ? $$->type->aggregate.name->c_str() : "(nil)" );
-			// for ( Attribute * attr: reverseIterate( $$->attributes ) ) {
-			// 	printf( "aggregate_type3 %s\n", attr->name.c_str() );
-			// } // for
 		}
 	| aggregate_key attribute_list_opt TYPEDEFname		// unqualified type name
@@ -2401,5 +2403,4 @@
 	  '{' field_declaration_list_opt '}' type_parameters_opt
 		{
-			// printf( "AGG3\n" );
 			DeclarationNode::newFromTypedef( $3 );
 			$$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 );
@@ -2412,5 +2413,4 @@
 	  '{' field_declaration_list_opt '}' type_parameters_opt
 		{
-			// printf( "AGG4\n" );
 			DeclarationNode::newFromTypeGen( $3, nullptr );
 			$$ = DeclarationNode::newAggregate( $1, $3, $8, $6, true )->addQualifiers( $2 );
@@ -2439,8 +2439,12 @@
 			// switched to a TYPEGENname. Link any generic arguments from typegen_name to new generic declaration and
 			// delete newFromTypeGen.
-			$$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, $3->type->symbolic.actuals, nullptr, false )->addQualifiers( $2 );
-			$3->type->symbolic.name = nullptr;
-			$3->type->symbolic.actuals = nullptr;
-			delete $3;
+			if ( $3->type->kind == TypeData::SymbolicInst && ! $3->type->symbolic.isTypedef ) {
+				$$ = $3->addQualifiers( $2 );
+			} else {
+				$$ = DeclarationNode::newAggregate( $1, $3->type->symbolic.name, $3->type->symbolic.actuals, nullptr, false )->addQualifiers( $2 );
+				$3->type->symbolic.name = nullptr;			// copied to $$
+				$3->type->symbolic.actuals = nullptr;
+				delete $3;
+			}
 		}
 	;
@@ -2779,5 +2783,5 @@
 type_no_function:										// sizeof, alignof, cast (constructor)
 	cfa_abstract_declarator_tuple						// CFA
-	| type_specifier
+	| type_specifier									// cannot be type_specifier_nobody, e.g., (struct S {}){} is a thing
 	| type_specifier abstract_declarator
 		{ $$ = $2->addType( $1 ); }
@@ -2843,5 +2847,5 @@
 		{ $$ = $3; }
 	| '[' push constant_expression ELLIPSIS constant_expression pop ']' // GCC, multiple array elements
-		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild<Expression>( $3 ), maybeMoveBuild<Expression>( $5 ) ) ); }
+		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild( $3 ), maybeMoveBuild( $5 ) ) ); }
 	| '.' '[' push field_name_list pop ']'				// CFA, tuple field selector
 		{ $$ = $4; }
@@ -3231,5 +3235,5 @@
 subrange:
 	constant_expression '~' constant_expression			// CFA, integer subrange
-		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild<Expression>( $1 ), maybeMoveBuild<Expression>( $3 ) ) ); }
+		{ $$ = new ExpressionNode( new RangeExpr( maybeMoveBuild( $1 ), maybeMoveBuild( $3 ) ) ); }
 	;
 
Index: src/Parser/parserutility.h
===================================================================
--- src/Parser/parserutility.h	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ src/Parser/parserutility.h	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:31:46 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Feb 16 12:34:00 2023
-// Update Count     : 5
+// Last Modified On : Thr Mar  9 12:16:00 2023
+// Update Count     : 6
 //
 
@@ -20,23 +20,12 @@
 Expression *notZeroExpr( Expression *orig );
 
-template< typename T, typename U >
-struct maybeBuild_t {
-	static T * doit( const U *orig ) {
-		if ( orig ) {
-			return orig->build();
-		} else {
-			return 0;
-		}
-	}
-};
-
-template< typename T, typename U >
-static inline T * maybeBuild( const U *orig ) {
-	return maybeBuild_t<T,U>::doit(orig);
+template< typename T >
+static inline auto maybeBuild( const T *orig ) -> decltype(orig->build()) {
+	return (orig) ? orig->build() : nullptr;
 }
 
-template< typename T, typename U >
-static inline T * maybeMoveBuild( const U *orig ) {
-	T* ret = maybeBuild<T>(orig);
+template< typename T >
+static inline auto maybeMoveBuild( const T *orig ) -> decltype(orig->build()) {
+	auto ret = maybeBuild<T>(orig);
 	delete orig;
 	return ret;
Index: tests/concurrent/channels/parallel_harness.hfa
===================================================================
--- tests/concurrent/channels/parallel_harness.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ tests/concurrent/channels/parallel_harness.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
Index: tests/io/comp_fair.cfa
===================================================================
--- tests/io/comp_fair.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ tests/io/comp_fair.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -29,5 +29,4 @@
 	barrier & bar;
 	int pipe[2];
-
 } globals;
 
Index: tests/linking/mangling/.expect/anon.txt
===================================================================
--- tests/linking/mangling/.expect/anon.txt	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
+++ tests/linking/mangling/.expect/anon.txt	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -0,0 +1,1 @@
+Done!
Index: tests/linking/mangling/header.hfa
===================================================================
--- tests/linking/mangling/header.hfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ tests/linking/mangling/header.hfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -8,6 +8,9 @@
 extern name_but_a_typedefed_t a_typedefed_global;
 
-extern struct /* anonymous */ {
-	int some_int;
-	int some_other_int;
-} a_global_with_no_type;
+// Must be extern C to prevent name mangling.
+extern "C" {
+	extern struct /* anonymous */ {
+		int some_int;
+		int some_other_int;
+	} a_global_with_no_type;
+}
Index: tests/linking/mangling/lib.cfa
===================================================================
--- tests/linking/mangling/lib.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ tests/linking/mangling/lib.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -3,6 +3,10 @@
 name_but_a_typedefed_t a_typedefed_global;
 
-struct {
-	int some_int;
-	int some_other_int;
-} a_global_with_no_type;
+// Must be extern C to prevent name mangling.
+extern "C" {
+	// This declaration is necessary to create an instance of a_global_with_no_type.
+	// typeof is a trick to get a_global_with_no_type's type because its type is anonymous.
+	// Otherwise C generates conflicting types for a_global_with_no_type in .h and .c
+	// because C uses name equivalence and the two anonymous types cannot have the same name.
+	typeof(a_global_with_no_type) a_global_with_no_type;
+}
Index: tests/linking/mangling/main.cfa
===================================================================
--- tests/linking/mangling/main.cfa	(revision 52175698e56ddb4cc7b4d18f052e296483cee189)
+++ tests/linking/mangling/main.cfa	(revision dbae9163821c5232467ee265e18c097eda7ada7e)
@@ -1,5 +1,5 @@
 #include <fstream.hfa>
 
-struct { int a; } test; //purposefully before the include
+static struct { int a; } test; // purposefully before the include to force anonymous name numbering
 
 #include "header.hfa"
@@ -13,5 +13,3 @@
 
 	sout | "Done!";
-
-	return 0;
 }
