Index: src/Parser/ExpressionNode.cc
===================================================================
--- src/Parser/ExpressionNode.cc	(revision 1cb7fab24a9d8ae701d8295e3857478969f5fd45)
+++ src/Parser/ExpressionNode.cc	(revision 874ffa43e82b839939022858a7229a1ebee5cec3)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:17:07 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Feb 13 18:07:38 2019
-// Update Count     : 902
+// Last Modified On : Thu Feb 28 21:36:38 2019
+// Update Count     : 933
 //
 
@@ -57,9 +57,31 @@
 static inline bool checkD( char c ) { return c == 'd' || c == 'D'; }
 static inline bool checkF80( char c ) { return c == 'w' || c == 'W'; }
+static inline bool checkF128( char c ) { return c == 'q' || c == 'Q'; }
 static inline bool checkL( char c ) { return c == 'l' || c == 'L'; }
-static inline bool checkF128( char c ) { return c == 'q' || c == 'Q'; }
 static inline bool checkI( char c ) { return c == 'i' || c == 'I'; }
 static inline bool checkB( char c ) { return c == 'b' || c == 'B'; }
 static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
+static inline bool checkN( char c ) { return c == 'n' || c == 'N'; }
+
+void lnthSuffix( string & str, int & type, int & ltype ) {
+	string::size_type posn = str.find_last_of( "lL" );
+	if ( posn != string::npos ) {
+		type = 3;										// default
+		posn += 1;										// advance to size
+		if ( str[posn] == '3' ) {						// 32
+			type = ltype = 2; str.erase( posn, 2 );
+		} else if ( str[posn] == '6' ) {				// 64
+			type = ltype = 3; str.erase( posn, 2 );
+		} else if ( str[posn] == '8' ) {				// 8
+			type = ltype = 1; str.erase( posn, 1 );
+		} else if ( str[posn] == '1' ) {
+			if ( str[posn + 1] == '6' ) {				// 16
+				type = ltype = 0; str.erase( posn, 2 );
+			} else {									// 128
+				type = ltype = 5; str.erase( posn, 3 );
+			} // if
+		} // if
+	} // if
+} // lnthSuffix
 
 Expression * build_constantInteger( string & str ) {
@@ -82,4 +104,5 @@
 	size_t last = str.length() - 1;						// last subscript of constant
 	Expression * ret;
+	string fred( str );
 
 	// special constants
@@ -93,5 +116,5 @@
 	} // if
 
-	// Cannot be "0"
+	// Cannot be just "0"/"1"; sscanf stops at the suffix, if any; value goes over the wall so always generate
 
 	if ( str[0] == '0' ) {								// radix character ?
@@ -115,67 +138,60 @@
 	} else {											// decimal constant ?
 		sscanf( (char *)str.c_str(), "%llu", &v );
-		//printf( "%llu %llu\n", v, v );
-	} // if
-
-	// At least one digit in integer constant, so safe to backup while looking for suffix.
+		//printf( "%llu\n", v );
+	} // if
 
 	string::size_type posn;
 
-	if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;
-
-	posn = str.rfind( "hh" );
-	if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
-
-	posn = str.rfind( "HH" );
-	if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
-
-	posn = str.find_last_of( "hH" );
-	if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }
-
-	posn = str.find_last_of( "zZ" );
-	if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; }
-
-	if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; }
-
-	posn = str.find_last_of( "lL" );
-	if ( posn != string::npos ) {
-		type = 3;										// default
-		posn += 1;										// advance to size
-		if ( str[posn] == '3' ) {						// 32
-			type = ltype = 2; str.erase( posn, 2 );
-		} else if ( str[posn] == '6' ) {				// 64
-			type = ltype = 3; str.erase( posn, 2 );
-		} else if ( str[posn] == '8' ) {				// 8
-			type = ltype = 1; str.erase( posn, 1 );
-		} else if ( str[posn] == '1' ) {
-			if ( str[posn + 1] == '6' ) {				// 16
-				type = ltype = 0; str.erase( posn, 2 );
-			} else {									// 128
-				type = ltype = 5; str.erase( posn, 3 );
+	if ( isdigit( str[last] ) ) {						// no suffix ?
+		lnthSuffix( str, type, ltype );					// could have length suffix
+		if ( type == -1 ) {
+			// no suffix type, use value to determine type
+			if ( v <= INT_MAX ) {						// signed int
+				type = 2;
+			} else if ( v <= UINT_MAX && ! dec ) {		// unsigned int
+				type = 2;
+				Unsigned = true;						// unsigned
+			} else if ( v <= LONG_MAX ) {				// signed long int
+				type = 3;
+			} else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int
+				type = 3;
+				Unsigned = true;						// unsigned long int
+			} else if ( v <= LLONG_MAX ) {				// signed long long int
+				type = 4;
+			} else {									// unsigned long long int
+				type = 4;
+				Unsigned = true;						// unsigned long long int
 			} // if
 		} // if
-	} // if
-  FINI:
-
-	if ( type == -1 ) {									// no suffix type, use value
-		if ( v <= INT_MAX ) {							// signed int
-			type = 2;
-		} else if ( v <= UINT_MAX && ! dec ) {			// unsigned int
-			type = 2;
-			Unsigned = true;							// unsigned
-		} else if ( v <= LONG_MAX ) {					// signed long int
-			type = 3;
-		} else if ( v <= ULONG_MAX && ( ! dec || LONG_MAX == LLONG_MAX ) ) { // signed long int
-			type = 3;
-			Unsigned = true;							// unsigned long int
-		} else if ( v <= LLONG_MAX ) {					// signed long long int
-			type = 4;
-		} else {										// unsigned long long int
-			type = 4;
-			Unsigned = true;							// unsigned long long int
-		} // if
-	} // if
-
+	} else {
+		// At least one digit in integer constant, so safe to backup while looking for suffix.
+
+		if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;
+
+		posn = str.rfind( "hh" );
+		if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
+
+		posn = str.rfind( "HH" );
+		if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
+
+		posn = str.find_last_of( "hH" );
+		if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }
+
+		posn = str.find_last_of( "nN" );
+		if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; }
+
+		posn = str.find_last_of( "zZ" );
+		if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; 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"
+		if ( type == -1 ) { type = 3; goto FINI; }
+	  FINI: ;
+	} // if
+
+	//if ( !( 0 <= type && type < 6 ) ) { printf( "%s %lu %d %s\n", fred.c_str(), fred.length(), type, str.c_str() ); }
 	assert( 0 <= type && type < 6 );
+
 	// Constant type is correct for overload resolving.
 	ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][type] ), str, v ) );
@@ -191,6 +207,6 @@
 		} // if
 	} // if
-  CLEANUP:
-
+
+  CLEANUP: ;
 	delete &str;										// created by lex
 	return ret;
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 1cb7fab24a9d8ae701d8295e3857478969f5fd45)
+++ src/Parser/TypeData.h	(revision 874ffa43e82b839939022858a7229a1ebee5cec3)
@@ -31,23 +31,23 @@
 	struct Aggregate_t {
 		DeclarationNode::Aggregate kind;
-		const std::string * name;
-		DeclarationNode * params;
-		ExpressionNode * actuals;						// holds actual parameters later applied to AggInst
-		DeclarationNode * fields;
+		const std::string * name = nullptr;
+		DeclarationNode * params = nullptr;
+		ExpressionNode * actuals = nullptr;						// holds actual parameters later applied to AggInst
+		DeclarationNode * fields = nullptr;
 		bool body;
 		bool anon;
 
 		bool tagged;
-		const std::string * parent;
+		const std::string * parent = nullptr;
 	};
 
 	struct AggInst_t {
-		TypeData * aggregate;
-		ExpressionNode * params;
+		TypeData * aggregate = nullptr;
+		ExpressionNode * params = nullptr;
 		bool hoistType;
 	};
 
 	struct Array_t {
-		ExpressionNode * dimension;
+		ExpressionNode * dimension = nullptr;
 		bool isVarLen;
 		bool isStatic;
@@ -55,6 +55,6 @@
 
 	struct Enumeration_t {
-		const std::string * name;
-		DeclarationNode * constants;
+		const std::string * name = nullptr;
+		DeclarationNode * constants = nullptr;
 		bool body;
 		bool anon;
@@ -62,22 +62,22 @@
 
 	struct Function_t {
-		mutable DeclarationNode * params;				// mutables modified in buildKRFunction
-		mutable DeclarationNode * idList;				// old-style
-		mutable DeclarationNode * oldDeclList;
-		StatementNode * body;
-		ExpressionNode * withExprs;						// expressions from function's with_clause
+		mutable DeclarationNode * params = nullptr;				// mutables modified in buildKRFunction
+		mutable DeclarationNode * idList = nullptr;				// old-style
+		mutable DeclarationNode * oldDeclList = nullptr;
+		StatementNode * body = nullptr;
+		ExpressionNode * withExprs = nullptr;						// expressions from function's with_clause
 	};
 
 	struct Symbolic_t {
-		const std::string * name;
+		const std::string * name = nullptr;
 		bool isTypedef;									// false => TYPEGENname, true => TYPEDEFname
-		DeclarationNode * params;
-		ExpressionNode * actuals;
-		DeclarationNode * assertions;
+		DeclarationNode * params = nullptr;
+		ExpressionNode * actuals = nullptr;
+		DeclarationNode * assertions = nullptr;
 	};
 
 	struct Qualified_t {								// qualified type S.T
-		TypeData * parent;
-		TypeData * child;
+		TypeData * parent = nullptr;
+		TypeData * child = nullptr;
 	};
 
@@ -93,5 +93,5 @@
 
 	Type::Qualifiers qualifiers;
-	DeclarationNode * forall;
+	DeclarationNode * forall = nullptr;
 
 	Aggregate_t aggregate;
@@ -102,6 +102,6 @@
 	Symbolic_t symbolic;
 	Qualified_t qualified;
-	DeclarationNode * tuple;
-	ExpressionNode * typeexpr;
+	DeclarationNode * tuple = nullptr;
+	ExpressionNode * typeexpr = nullptr;
 
 	TypeData( Kind k = Unknown );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 1cb7fab24a9d8ae701d8295e3857478969f5fd45)
+++ src/Parser/lex.ll	(revision 874ffa43e82b839939022858a7229a1ebee5cec3)
@@ -10,6 +10,6 @@
  * Created On       : Sat Sep 22 08:58:10 2001
  * Last Modified By : Peter A. Buhr
- * Last Modified On : Wed Feb 13 17:33:53 2019
- * Update Count     : 702
+ * Last Modified On : Wed Feb 27 22:44:03 2019
+ * Update Count     : 704
  */
 
@@ -99,5 +99,5 @@
 hex_quad {hex}("_"?{hex}){3}
 size_opt (8|16|32|64|128)?
-length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hH])
+length ("ll"|"LL"|[lL]{size_opt})|("hh"|"HH"|[hHnN])
 integer_suffix_opt ("_"?(([uU]({length}?[iI]?)|([iI]{length}))|([iI]({length}?[uU]?)|([uU]{length}))|({length}([iI]?[uU]?)|([uU][iI]))|[zZ]))?
 
