Index: src/SynTree/Declaration.cc
===================================================================
--- src/SynTree/Declaration.cc	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/Declaration.cc	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  9 14:28:05 2017
-// Update Count     : 16
+// Last Modified On : Wed Mar  1 20:11:57 2017
+// Update Count     : 17
 //
 
@@ -28,9 +28,9 @@
 
 Declaration::Declaration( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage )
-		: name( name ), storageClass( sc ), linkage( linkage ), isInline( false ), isNoreturn( false ), uniqueId( 0 ) {
+		: name( name ), storageClass( sc ), linkage( linkage ), uniqueId( 0 ) {
 }
 
 Declaration::Declaration( const Declaration &other )
-	: name( other.name ), storageClass( other.storageClass ), linkage( other.linkage ), isInline( other.isInline ), isNoreturn( other.isNoreturn ), uniqueId( other.uniqueId ) {
+	: name( other.name ), storageClass( other.storageClass ), linkage( other.linkage ), uniqueId( other.uniqueId ) {
 }
 
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/Declaration.h	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 16 14:53:35 2017
-// Update Count     : 57
+// Last Modified On : Fri Mar  3 20:59:27 2017
+// Update Count     : 96
 //
 
@@ -38,8 +38,4 @@
 	LinkageSpec::Spec get_linkage() const { return linkage; }
 	void set_linkage( LinkageSpec::Spec newValue ) { linkage = newValue; }
-	bool get_isInline() const { return isInline; }
-	void set_isInline( bool newValue ) { isInline = newValue; }
-	bool get_isNoreturn() const { return isNoreturn; }
-	void set_isNoreturn( bool newValue ) { isNoreturn = newValue; }
 	UniqueId get_uniqueId() const { return uniqueId; }
 	bool get_extension() const { return extension; }
@@ -59,5 +55,4 @@
 	DeclarationNode::StorageClass storageClass;
 	LinkageSpec::Spec linkage;
-	bool isInline, isNoreturn;
 	UniqueId uniqueId;
 	bool extension = false;
@@ -66,5 +61,5 @@
 class DeclarationWithType : public Declaration {
   public:
-	DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes );
+	DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, DeclarationNode::FuncSpec fs = DeclarationNode::FuncSpec() );
 	DeclarationWithType( const DeclarationWithType &other );
 	virtual ~DeclarationWithType();
@@ -83,4 +78,7 @@
 	std::list< Attribute * >& get_attributes() { return attributes; }
 	const std::list< Attribute * >& get_attributes() const { return attributes; }
+
+	DeclarationNode::FuncSpec get_funcSpec() const { return fs; }
+	void set_functionSpecifiers( DeclarationNode::FuncSpec newValue ) { fs = newValue; }
 
 	virtual DeclarationWithType *clone() const = 0;
@@ -97,4 +95,5 @@
 	ConstantExpr *asmName;
 	std::list< Attribute * > attributes;
+	DeclarationNode::FuncSpec fs;
 };
 
@@ -102,5 +101,6 @@
 	typedef DeclarationWithType Parent;
   public:
-	ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init, const std::list< Attribute * > attributes = std::list< Attribute * >(), bool isInline = false, bool isNoreturn = false );
+	ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init,
+				const std::list< Attribute * > attributes = std::list< Attribute * >(), DeclarationNode::FuncSpec fs = DeclarationNode::FuncSpec() );
 	ObjectDecl( const ObjectDecl &other );
 	virtual ~ObjectDecl();
@@ -129,5 +129,6 @@
 	typedef DeclarationWithType Parent;
   public:
-	FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, const std::list< Attribute * > attributes = std::list< Attribute * >() );
+	FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements,
+				  const std::list< Attribute * > attributes = std::list< Attribute * >(), DeclarationNode::FuncSpec fs = DeclarationNode::FuncSpec() );
 	FunctionDecl( const FunctionDecl &other );
 	virtual ~FunctionDecl();
Index: src/SynTree/DeclarationWithType.cc
===================================================================
--- src/SynTree/DeclarationWithType.cc	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/DeclarationWithType.cc	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Dec 13 14:49:43 2016
-// Update Count     : 7
+// Last Modified On : Fri Mar  3 20:59:28 2017
+// Update Count     : 19
 //
 
@@ -19,10 +19,10 @@
 #include "Common/utility.h"
 
-DeclarationWithType::DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes )
-	: Declaration( name, sc, linkage ), asmName( nullptr ), attributes( attributes ) {
+DeclarationWithType::DeclarationWithType( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, const std::list< Attribute * > & attributes, DeclarationNode::FuncSpec fs )
+	: Declaration( name, sc, linkage ), asmName( nullptr ), attributes( attributes ), fs( fs ) {
 }
 
 DeclarationWithType::DeclarationWithType( const DeclarationWithType &other )
-		: Declaration( other ), mangleName( other.mangleName ), scopeLevel( other.scopeLevel ) {
+	: Declaration( other ), mangleName( other.mangleName ), scopeLevel( other.scopeLevel ), fs( other.fs ) {
 	cloneAll( other.attributes, attributes );
 	asmName = maybeClone( other.asmName );
Index: src/SynTree/FunctionDecl.cc
===================================================================
--- src/SynTree/FunctionDecl.cc	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/FunctionDecl.cc	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 16 15:01:52 2017
-// Update Count     : 23
+// Last Modified On : Fri Mar  3 21:29:41 2017
+// Update Count     : 55
 //
 
@@ -26,10 +26,9 @@
 extern bool translation_unit_nomain;
 
-FunctionDecl::FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, bool isInline, bool isNoreturn, std::list< Attribute * > attributes )
-		: Parent( name, sc, linkage, attributes ), type( type ), statements( statements ) {
-	set_isInline( isInline );
-	set_isNoreturn( isNoreturn );
-	// this is a brazen hack to force the function "main" to have Cforall linkage
-	// because we want to replace the main even if it is inside an extern
+FunctionDecl::FunctionDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, FunctionType *type, CompoundStmt *statements, std::list< Attribute * > attributes, DeclarationNode::FuncSpec fs )
+		: Parent( name, sc, linkage, attributes, fs ), type( type ), statements( statements ) {
+	set_functionSpecifiers( fs );
+
+	// hack forcing the function "main" to have Cforall linkage to replace main even if it is inside an extern
 	if ( name == "main" ) {
 		set_linkage( CodeGen::FixMain::mainLinkage() );
@@ -65,16 +64,12 @@
 		os << LinkageSpec::linkageName( get_linkage() ) << " ";
 	} // if
-	if ( get_isInline() ) {
-		os << "inline ";
-	} // if
-	if ( get_isNoreturn() ) {
-		os << "_Noreturn ";
-	} // if
 
 	printAll( get_attributes(), os, indent );
 
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
-		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
+		os << DeclarationNode::storageClassNames[ get_storageClass() ] << ' ';
 	} // if
+	DeclarationNode::print_FuncSpec( os, get_funcSpec() );
+
 	if ( get_type() ) {
 		get_type()->print( os, indent );
@@ -97,16 +92,12 @@
 		os << get_name() << ": ";
 	} // if
-	if ( get_isInline() ) {
-		os << "inline ";
-	} // if
-	if ( get_isNoreturn() ) {
-		os << "_Noreturn ";
-	} // if
 
 	// xxx - should printShort print attributes?
 
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
-		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
+		os << DeclarationNode::storageClassNames[ get_storageClass() ] << ' ';
 	} // if
+	DeclarationNode::print_FuncSpec( os, get_funcSpec() );
+
 	if ( get_type() ) {
 		get_type()->print( os, indent );
Index: src/SynTree/NamedTypeDecl.cc
===================================================================
--- src/SynTree/NamedTypeDecl.cc	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/NamedTypeDecl.cc	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 13 08:13:55 2015
-// Update Count     : 3
+// Last Modified On : Tue Feb 28 16:13:24 2017
+// Update Count     : 4
 //
 
@@ -40,5 +40,5 @@
 	} // if
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
-		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
+		os << DeclarationNode::storageClassNames[ get_storageClass() ] << ' ';
 	} // if
 	os << typeString();
@@ -64,5 +64,5 @@
 	} // if
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
-		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
+		os << DeclarationNode::storageClassNames[ get_storageClass() ] << ' ';
 	} // if
 	os << typeString();
Index: src/SynTree/ObjectDecl.cc
===================================================================
--- src/SynTree/ObjectDecl.cc	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/ObjectDecl.cc	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Oct  1 23:05:56 2016
-// Update Count     : 32
+// Last Modified On : Fri Mar  3 20:59:27 2017
+// Update Count     : 45
 //
 
@@ -22,8 +22,7 @@
 #include "Statement.h"
 
-ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init, const std::list< Attribute * > attributes, bool isInline, bool isNoreturn )
-	: Parent( name, sc, linkage, attributes ), type( type ), init( init ), bitfieldWidth( bitfieldWidth ) {
-	set_isInline( isInline );
-	set_isNoreturn( isNoreturn );
+ObjectDecl::ObjectDecl( const std::string &name, DeclarationNode::StorageClass sc, LinkageSpec::Spec linkage, Expression *bitfieldWidth, Type *type, Initializer *init, const std::list< Attribute * > attributes, DeclarationNode::FuncSpec fs )
+	: Parent( name, sc, linkage, attributes, fs ), type( type ), init( init ), bitfieldWidth( bitfieldWidth ) {
+	set_functionSpecifiers( fs );
 }
 
@@ -50,5 +49,5 @@
 
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
-		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
+		os << DeclarationNode::storageClassNames[ get_storageClass() ] << ' ';
 	} // if
 
@@ -86,5 +85,5 @@
 
 	if ( get_storageClass() != DeclarationNode::NoStorageClass ) {
-		os << DeclarationNode::storageName[ get_storageClass() ] << ' ';
+		os << DeclarationNode::storageClassNames[ get_storageClass() ] << ' ';
 	} // if
 
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 43c89a78fd93abc599e03ce30605af5a82c4e1cc)
+++ src/SynTree/Type.h	(revision dd020c0cdff72537d5b1dffcf6920c72db9d585a)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb 23 16:38:53 2017
-// Update Count     : 34
+// Last Modified On : Wed Mar  1 09:11:45 2017
+// Update Count     : 41
 //
 
@@ -21,5 +21,4 @@
 #include "SynTree.h"
 #include "Visitor.h"
-#include "Common/utility.h"
 
 class Type : public BaseSyntaxNode {
@@ -213,5 +212,4 @@
 	bool get_isVarArgs() const { return isVarArgs; }
 	void set_isVarArgs( bool newValue ) { isVarArgs = newValue; }
-
 	bool isTtype() const;
 
