Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 4858a889060e180ad11caac083e08e61be604048)
+++ src/Parser/DeclarationNode.cc	(revision ed9a1ae9fd2dfee0f1af522273e707b0ae29b439)
@@ -262,5 +262,5 @@
 	newnode->type->enumeration.anon = name == nullptr;
 	if ( base && base->type)  {
-		newnode->type->base = base->type;	
+		newnode->type->base = base->type;
 	} // if
 
@@ -505,5 +505,5 @@
 			} // for
 			// src is the new item being added and has a single bit
-		} else if ( ! src->storageClasses.is_threadlocal ) { // conflict ?
+		} else if ( ! src->storageClasses.is_threadlocal_any() ) { // conflict ?
 			appendError( error, string( "conflicting " ) + Type::StorageClassesNames[storageClasses.ffs()] +
 						 " & " + Type::StorageClassesNames[src->storageClasses.ffs()] );
Index: src/Parser/lex.ll
===================================================================
--- src/Parser/lex.ll	(revision 4858a889060e180ad11caac083e08e61be604048)
+++ src/Parser/lex.ll	(revision ed9a1ae9fd2dfee0f1af522273e707b0ae29b439)
@@ -314,6 +314,6 @@
 switch			{ KEYWORD_RETURN(SWITCH); }
 thread			{ KEYWORD_RETURN(THREAD); }				// C11
-__thread		{ KEYWORD_RETURN(THREADLOCAL); }		// GCC
-_Thread_local	{ KEYWORD_RETURN(THREADLOCAL); }		// C11
+__thread		{ KEYWORD_RETURN(THREADLOCALGCC); }		// GCC
+_Thread_local	{ KEYWORD_RETURN(THREADLOCALC11); }		// C11
 throw			{ KEYWORD_RETURN(THROW); }				// CFA
 throwResume		{ KEYWORD_RETURN(THROWRESUME); }		// CFA
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 4858a889060e180ad11caac083e08e61be604048)
+++ src/Parser/parser.yy	(revision ed9a1ae9fd2dfee0f1af522273e707b0ae29b439)
@@ -293,5 +293,5 @@
 %token TYPEDEF
 %token EXTERN STATIC AUTO REGISTER
-%token THREADLOCAL										// C11
+%token THREADLOCALGCC THREADLOCALC11						// GCC, C11
 %token INLINE FORTRAN									// C99, extension ISO/IEC 9899:1999 Section J.5.9(1)
 %token NORETURN											// C11
@@ -1345,5 +1345,5 @@
 		{
 			if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
-			else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 
+			else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
 		}
 	| comma_expression updowneq comma_expression '~' comma_expression // CFA, anonymous loop-index
@@ -1357,5 +1357,5 @@
 		{
 			if ( $2 == OperKinds::LThan || $2 == OperKinds::LEThan ) { SemanticError( yylloc, MISSING_ANON_FIELD ); $$ = nullptr; }
-			else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; } 
+			else { SemanticError( yylloc, MISSING_HIGH ); $$ = nullptr; }
 		}
 	| comma_expression updowneq comma_expression '~' '@' // CFA, error
@@ -2082,6 +2082,8 @@
 	| REGISTER
 		{ $$ = DeclarationNode::newStorageClass( Type::Register ); }
-	| THREADLOCAL										// C11
-		{ $$ = DeclarationNode::newStorageClass( Type::Threadlocal ); }
+	| THREADLOCALGCC										// GCC
+		{ $$ = DeclarationNode::newStorageClass( Type::ThreadlocalGcc ); }
+	| THREADLOCALC11										// C11
+		{ $$ = DeclarationNode::newStorageClass( Type::ThreadlocalC11 ); }
 		// Put function specifiers here to simplify parsing rules, but separate them semantically.
 	| INLINE											// C99
