Index: src/Common/SemanticError.h
===================================================================
--- src/Common/SemanticError.h	(revision 7f38b67a9dc4024ec3e7a9ae92c13720b3b5998b)
+++ src/Common/SemanticError.h	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -58,4 +58,5 @@
 	{"aggregate-forward-decl" , "forward declaration of nested aggregate: %s"  , Severity::Warn},
 	{"superfluous-decl"       , "declaration does not allocate storage: %s"    , Severity::Warn},
+	{"gcc-attributes"         , "invalid attribute: %s"                        , Severity::Warn},
 };
 
@@ -66,4 +67,5 @@
 	AggrForwardDecl,
 	SuperfluousDecl,
+	GccAttributes,
 	NUMBER_OF_WARNINGS, // This MUST be the last warning
 };
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision 7f38b67a9dc4024ec3e7a9ae92c13720b3b5998b)
+++ src/Makefile.am	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -38,4 +38,5 @@
 include SynTree/module.mk
 include Tuples/module.mk
+include Validate/module.mk
 include Virtual/module.mk
 
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 7f38b67a9dc4024ec3e7a9ae92c13720b3b5998b)
+++ src/Makefile.in	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -23,4 +23,7 @@
 #SRC +=  ArgTweak/Rewriter.cc \
 #	ArgTweak/Mutate.cc
+
+######################### -*- Mode: Makefile-Gmake -*- ########################
+###############################################################################
 
 ######################### -*- Mode: Makefile-Gmake -*- ########################
@@ -150,4 +153,5 @@
 am__objects_1 = driver_cfa_cpp-main.$(OBJEXT) \
 	driver_cfa_cpp-MakeLibCfa.$(OBJEXT) \
+	driver_cfa_cpp-CompilationState.$(OBJEXT) \
 	CodeGen/driver_cfa_cpp-Generate.$(OBJEXT) \
 	CodeGen/driver_cfa_cpp-CodeGenerator.$(OBJEXT) \
@@ -254,4 +258,5 @@
 	Tuples/driver_cfa_cpp-TupleExpansion.$(OBJEXT) \
 	Tuples/driver_cfa_cpp-Explode.$(OBJEXT) \
+	Validate/driver_cfa_cpp-HandleAttributes.$(OBJEXT) \
 	Virtual/driver_cfa_cpp-ExpandCasts.$(OBJEXT)
 am_driver_cfa_cpp_OBJECTS = $(am__objects_1)
@@ -354,7 +359,8 @@
 	$(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk \
 	$(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk \
-	$(srcdir)/Tuples/module.mk $(srcdir)/Virtual/module.mk \
-	$(top_srcdir)/automake/depcomp $(top_srcdir)/automake/ylwrap \
-	Parser/lex.cc Parser/parser.cc Parser/parser.hh
+	$(srcdir)/Tuples/module.mk $(srcdir)/Validate/module.mk \
+	$(srcdir)/Virtual/module.mk $(top_srcdir)/automake/depcomp \
+	$(top_srcdir)/automake/ylwrap Parser/lex.cc Parser/parser.cc \
+	Parser/parser.hh
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
@@ -481,5 +487,5 @@
 # create object files in directory with source files
 AUTOMAKE_OPTIONS = subdir-objects
-SRC = main.cc MakeLibCfa.cc CodeGen/Generate.cc \
+SRC = main.cc MakeLibCfa.cc CompilationState.cc CodeGen/Generate.cc \
 	CodeGen/CodeGenerator.cc CodeGen/GenType.cc \
 	CodeGen/FixNames.cc CodeGen/FixMain.cc \
@@ -530,5 +536,6 @@
 	SynTree/Attribute.cc SynTree/DeclReplacer.cc \
 	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
-	Tuples/Explode.cc Virtual/ExpandCasts.cc
+	Tuples/Explode.cc Validate/HandleAttributes.cc \
+	Virtual/ExpandCasts.cc
 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
 	${cfa_cpplib_PROGRAMS}}
@@ -549,5 +556,5 @@
 .SUFFIXES:
 .SUFFIXES: .cc .ll .o .obj .yy
-$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Virtual/module.mk $(am__configure_deps)
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Validate/module.mk $(srcdir)/Virtual/module.mk $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -569,5 +576,5 @@
 	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
 	esac;
-$(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Virtual/module.mk $(am__empty):
+$(srcdir)/CodeGen/module.mk $(srcdir)/CodeTools/module.mk $(srcdir)/Concurrency/module.mk $(srcdir)/Common/module.mk $(srcdir)/ControlStruct/module.mk $(srcdir)/GenPoly/module.mk $(srcdir)/InitTweak/module.mk $(srcdir)/Parser/module.mk $(srcdir)/ResolvExpr/module.mk $(srcdir)/SymTab/module.mk $(srcdir)/SynTree/module.mk $(srcdir)/Tuples/module.mk $(srcdir)/Validate/module.mk $(srcdir)/Virtual/module.mk $(am__empty):
 
 $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -930,4 +937,12 @@
 Tuples/driver_cfa_cpp-Explode.$(OBJEXT): Tuples/$(am__dirstamp) \
 	Tuples/$(DEPDIR)/$(am__dirstamp)
+Validate/$(am__dirstamp):
+	@$(MKDIR_P) Validate
+	@: > Validate/$(am__dirstamp)
+Validate/$(DEPDIR)/$(am__dirstamp):
+	@$(MKDIR_P) Validate/$(DEPDIR)
+	@: > Validate/$(DEPDIR)/$(am__dirstamp)
+Validate/driver_cfa_cpp-HandleAttributes.$(OBJEXT):  \
+	Validate/$(am__dirstamp) Validate/$(DEPDIR)/$(am__dirstamp)
 Virtual/$(am__dirstamp):
 	@$(MKDIR_P) Virtual
@@ -960,4 +975,5 @@
 	-rm -f SynTree/*.$(OBJEXT)
 	-rm -f Tuples/*.$(OBJEXT)
+	-rm -f Validate/*.$(OBJEXT)
 	-rm -f Virtual/*.$(OBJEXT)
 
@@ -965,4 +981,5 @@
 	-rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver_cfa_cpp-CompilationState.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver_cfa_cpp-MakeLibCfa.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/driver_cfa_cpp-main.Po@am__quote@
@@ -1071,4 +1088,5 @@
 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleAssignment.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Tuples/$(DEPDIR)/driver_cfa_cpp-TupleExpansion.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@Virtual/$(DEPDIR)/driver_cfa_cpp-ExpandCasts.Po@am__quote@
 
@@ -1117,4 +1135,18 @@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o driver_cfa_cpp-MakeLibCfa.obj `if test -f 'MakeLibCfa.cc'; then $(CYGPATH_W) 'MakeLibCfa.cc'; else $(CYGPATH_W) '$(srcdir)/MakeLibCfa.cc'; fi`
 
+driver_cfa_cpp-CompilationState.o: CompilationState.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT driver_cfa_cpp-CompilationState.o -MD -MP -MF $(DEPDIR)/driver_cfa_cpp-CompilationState.Tpo -c -o driver_cfa_cpp-CompilationState.o `test -f 'CompilationState.cc' || echo '$(srcdir)/'`CompilationState.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/driver_cfa_cpp-CompilationState.Tpo $(DEPDIR)/driver_cfa_cpp-CompilationState.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='CompilationState.cc' object='driver_cfa_cpp-CompilationState.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o driver_cfa_cpp-CompilationState.o `test -f 'CompilationState.cc' || echo '$(srcdir)/'`CompilationState.cc
+
+driver_cfa_cpp-CompilationState.obj: CompilationState.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT driver_cfa_cpp-CompilationState.obj -MD -MP -MF $(DEPDIR)/driver_cfa_cpp-CompilationState.Tpo -c -o driver_cfa_cpp-CompilationState.obj `if test -f 'CompilationState.cc'; then $(CYGPATH_W) 'CompilationState.cc'; else $(CYGPATH_W) '$(srcdir)/CompilationState.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/driver_cfa_cpp-CompilationState.Tpo $(DEPDIR)/driver_cfa_cpp-CompilationState.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='CompilationState.cc' object='driver_cfa_cpp-CompilationState.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o driver_cfa_cpp-CompilationState.obj `if test -f 'CompilationState.cc'; then $(CYGPATH_W) 'CompilationState.cc'; else $(CYGPATH_W) '$(srcdir)/CompilationState.cc'; fi`
+
 CodeGen/driver_cfa_cpp-Generate.o: CodeGen/Generate.cc
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT CodeGen/driver_cfa_cpp-Generate.o -MD -MP -MF CodeGen/$(DEPDIR)/driver_cfa_cpp-Generate.Tpo -c -o CodeGen/driver_cfa_cpp-Generate.o `test -f 'CodeGen/Generate.cc' || echo '$(srcdir)/'`CodeGen/Generate.cc
@@ -2572,4 +2604,18 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Tuples/driver_cfa_cpp-Explode.obj `if test -f 'Tuples/Explode.cc'; then $(CYGPATH_W) 'Tuples/Explode.cc'; else $(CYGPATH_W) '$(srcdir)/Tuples/Explode.cc'; fi`
+
+Validate/driver_cfa_cpp-HandleAttributes.o: Validate/HandleAttributes.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Validate/driver_cfa_cpp-HandleAttributes.o -MD -MP -MF Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Tpo -c -o Validate/driver_cfa_cpp-HandleAttributes.o `test -f 'Validate/HandleAttributes.cc' || echo '$(srcdir)/'`Validate/HandleAttributes.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Tpo Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='Validate/HandleAttributes.cc' object='Validate/driver_cfa_cpp-HandleAttributes.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Validate/driver_cfa_cpp-HandleAttributes.o `test -f 'Validate/HandleAttributes.cc' || echo '$(srcdir)/'`Validate/HandleAttributes.cc
+
+Validate/driver_cfa_cpp-HandleAttributes.obj: Validate/HandleAttributes.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT Validate/driver_cfa_cpp-HandleAttributes.obj -MD -MP -MF Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Tpo -c -o Validate/driver_cfa_cpp-HandleAttributes.obj `if test -f 'Validate/HandleAttributes.cc'; then $(CYGPATH_W) 'Validate/HandleAttributes.cc'; else $(CYGPATH_W) '$(srcdir)/Validate/HandleAttributes.cc'; fi`
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Tpo Validate/$(DEPDIR)/driver_cfa_cpp-HandleAttributes.Po
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='Validate/HandleAttributes.cc' object='Validate/driver_cfa_cpp-HandleAttributes.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o Validate/driver_cfa_cpp-HandleAttributes.obj `if test -f 'Validate/HandleAttributes.cc'; then $(CYGPATH_W) 'Validate/HandleAttributes.cc'; else $(CYGPATH_W) '$(srcdir)/Validate/HandleAttributes.cc'; fi`
 
 Virtual/driver_cfa_cpp-ExpandCasts.o: Virtual/ExpandCasts.cc
@@ -2734,4 +2780,6 @@
 	-rm -f Tuples/$(DEPDIR)/$(am__dirstamp)
 	-rm -f Tuples/$(am__dirstamp)
+	-rm -f Validate/$(DEPDIR)/$(am__dirstamp)
+	-rm -f Validate/$(am__dirstamp)
 	-rm -f Virtual/$(DEPDIR)/$(am__dirstamp)
 	-rm -f Virtual/$(am__dirstamp)
@@ -2751,5 +2799,5 @@
 
 distclean: distclean-am
-	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Virtual/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
 	-rm -f Makefile
 distclean-am: clean-am distclean-compile distclean-generic \
@@ -2797,5 +2845,5 @@
 
 maintainer-clean: maintainer-clean-am
-	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Virtual/$(DEPDIR)
+	-rm -rf ./$(DEPDIR) CodeGen/$(DEPDIR) CodeTools/$(DEPDIR) Common/$(DEPDIR) Concurrency/$(DEPDIR) ControlStruct/$(DEPDIR) GenPoly/$(DEPDIR) InitTweak/$(DEPDIR) Parser/$(DEPDIR) ResolvExpr/$(DEPDIR) SymTab/$(DEPDIR) SynTree/$(DEPDIR) Tuples/$(DEPDIR) Validate/$(DEPDIR) Virtual/$(DEPDIR)
 	-rm -f Makefile
 maintainer-clean-am: distclean-am maintainer-clean-generic
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 7f38b67a9dc4024ec3e7a9ae92c13720b3b5998b)
+++ src/SymTab/Validate.cc	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -73,4 +73,5 @@
 #include "SynTree/TypeSubstitution.h"  // for TypeSubstitution
 #include "SynTree/Visitor.h"           // for Visitor
+#include "Validate/HandleAttributes.h" // for handleAttributes
 
 class CompoundStmt;
@@ -314,4 +315,5 @@
 		acceptAll( translationUnit, finder ); // xxx - remove this pass soon
 		mutateAll( translationUnit, labelAddrFixer );
+		Validate::handleAttributes( translationUnit );
 	}
 
Index: src/Validate/HandleAttributes.cc
===================================================================
--- src/Validate/HandleAttributes.cc	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
+++ src/Validate/HandleAttributes.cc	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -0,0 +1,160 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// HandleAttributes.cc --
+//
+// Author           : Rob Schluntz
+// Created On       : Fri Jul 27 10:15:06 2018
+// Last Modified By : Rob Schluntz
+// Last Modified On : Fri Jul 27 10:16:43 2018
+// Update Count     : 2
+//
+
+#include "HandleAttributes.h"
+
+#include <utility> // for pair
+
+#include "CompilationState.h"
+#include "Common/PassVisitor.h"
+#include "Common/SemanticError.h"
+#include "InitTweak/InitTweak.h"
+#include "ResolvExpr/Resolver.h"
+#include "SynTree/Attribute.h"
+#include "SynTree/Declaration.h"
+#include "SynTree/Type.h"
+
+namespace Validate {
+	namespace {
+		std::pair<long long int, bool> eval(Expression * expr);
+
+		struct Eval : public WithShortCircuiting {
+			long long int value = 0;
+			bool valid = true;
+
+			void previsit( BaseSyntaxNode * ) { visit_children = false; }
+			void postvisit( BaseSyntaxNode * ) { valid = false; }
+
+			void postvisit( ConstantExpr * expr ) {
+				value = expr->intValue();
+			}
+
+			void postvisit( CastExpr * expr ) {
+				auto arg = eval(expr->arg);
+				valid = arg.second;
+				value = arg.first;
+				// TODO: perform type conversion on value if valid
+			}
+
+			void postvisit( VariableExpr * expr ) {
+				if ( EnumInstType * inst = dynamic_cast<EnumInstType *>(expr->result) ) {
+					if ( EnumDecl * decl = inst->baseEnum ) {
+						if ( decl->valueOf( expr->var, value ) ) { // value filled by valueOf
+							return;
+						}
+					}
+				}
+				valid = false;
+			}
+
+			void postvisit( ApplicationExpr * expr ) {
+				DeclarationWithType * function = InitTweak::getFunction(expr);
+				if ( ! function || function->linkage != LinkageSpec::Intrinsic ) { valid = false; return; }
+				const std::string & fname = function->name;
+				assertf( expr->args.size() == 1 || expr->args.size() == 2, "Intrinsic function with %zd arguments: %s", expr->args.size(), fname.c_str() );
+				std::pair<long long int, bool> arg1, arg2;
+				arg1 = eval(expr->args.front());
+				valid = valid && arg1.second;
+				if ( ! valid ) return;
+				if ( expr->args.size() == 2 ) {
+					arg2 = eval(expr->args.back());
+					valid = valid && arg2.second;
+					if ( ! valid ) return;
+				}
+				if (fname == "?+?") {
+					value = arg1.first + arg2.first;
+				} else if (fname == "?-?") {
+					value = arg1.first - arg2.first;
+				} else if (fname == "?*?") {
+					value = arg1.first * arg2.first;
+				} else if (fname == "?/?") {
+					value = arg1.first / arg2.first;
+				} else if (fname == "?%?") {
+					value = arg1.first % arg2.first;
+				} else {
+					valid = false;
+				}
+				// TODO: implement other intrinsic functions
+			}
+		};
+
+		std::pair<long long int, bool> eval(Expression * expr) {
+			PassVisitor<Eval> ev;
+			if (expr) {
+				expr->accept(ev);
+				return std::make_pair(ev.pass.value, ev.pass.valid);
+			} else {
+				return std::make_pair(0, false);
+			}
+		}
+
+		struct HandleAttributes : public WithIndexer {
+			void previsit( ObjectDecl * decl );
+			void previsit( FunctionDecl * decl );
+		};
+	} // namespace
+
+	void handleAttributes( std::list< Declaration * > &translationUnit ) {
+		PassVisitor<HandleAttributes> handler;
+		acceptAll( translationUnit, handler );
+	}
+
+	namespace {
+		void HandleAttributes::previsit( ObjectDecl * decl ) {
+			for ( Attribute * attr : decl->attributes ) {
+				std::string name = attr->normalizedName();
+				if (name == "init_priority") {
+
+				}
+			}
+		}
+
+		void HandleAttributes::previsit( FunctionDecl * decl ) {
+			for ( Attribute * attr : decl->attributes ) {
+				std::string name = attr->normalizedName();
+				if (name == "constructor" || name == "destructor") {
+					if (attr->parameters.size() == 1) {
+						Expression *& arg = attr->parameters.front();
+						ResolvExpr::findSingleExpression( arg, new BasicType( Type::Qualifiers(), BasicType::LongLongSignedInt ), indexer );
+						auto result = eval(arg);
+						if (! result.second) {
+							SemanticWarning(attr->location, Warning::GccAttributes,
+								toCString( name, " priorities must be integers from 0 to 65535 inclusive: ", arg ) );
+							return;
+						}
+						auto priority = result.first;
+						if (priority < 101) {
+							SemanticWarning(attr->location, Warning::GccAttributes,
+								toCString( name, " priorities from 0 to 100 are reserved for the implementation" ) );
+						} else if (priority < 201) {
+							SemanticWarning(attr->location, Warning::GccAttributes,
+								toCString( name, " priorities from 101 to 200 are reserved for the implementation" ) );
+						}
+					} else if (attr->parameters.size() > 1) {
+						SemanticWarning(attr->location, Warning::GccAttributes, toCString( "too many arguments to ", name, " attribute" ) );
+					} else {
+						SemanticWarning(attr->location, Warning::GccAttributes, toCString( "too few arguments to ", name, " attribute" ) );
+					}
+				}
+			}
+		}
+	} // namespace
+} // namespace Validate
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/Validate/HandleAttributes.h
===================================================================
--- src/Validate/HandleAttributes.h	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
+++ src/Validate/HandleAttributes.h	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -0,0 +1,30 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// HandleAttributes.h --
+//
+// Author           : Rob Schluntz
+// Created On       : Fri Jul 27 10:10:10 2018
+// Last Modified By : Rob Schluntz
+// Last Modified On : Fri Jul 27 10:12:53 2018
+// Update Count     : 2
+//
+
+#pragma once
+
+#include <list>  // for list
+
+class Declaration;
+
+namespace Validate {
+	void handleAttributes( std::list< Declaration * > &translationUnit );
+} // namespace Validate
+
+// Local Variables: //
+// tab-width: 4 //
+// mode: c++ //
+// compile-command: "make install" //
+// End: //
Index: src/Validate/module.mk
===================================================================
--- src/Validate/module.mk	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
+++ src/Validate/module.mk	(revision fd2debf6bc04a25e7312e0b1f5ff93f7d5aff352)
@@ -0,0 +1,17 @@
+######################### -*- Mode: Makefile-Gmake -*- ########################
+##
+## Cforall Version 1.0.0 Copyright (C) 2018 University of Waterloo
+##
+## The contents of this file are covered under the licence agreement in the
+## file "LICENCE" distributed with Cforall.
+##
+## module.mk --
+##
+## Author           : Rob Schluntz
+## Created On       : Fri Jul 27 10:10:10 2018
+## Last Modified By : Rob Schluntz
+## Last Modified On : Fri Jul 27 10:10:26 2018
+## Update Count     : 2
+###############################################################################
+
+SRC += Validate/HandleAttributes.cc
