Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 679a2609d317ee3840e5702dbd73842c77514621)
+++ src/Parser/DeclarationNode.cc	(revision e07caa205c9b4722ae70dd338e75f6c51cd6adf9)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 18 22:50:27 2018
-// Update Count     : 1096
+// Last Modified On : Thu Jul 19 17:40:03 2018
+// Update Count     : 1106
 //
 
@@ -54,14 +54,5 @@
 
 DeclarationNode::DeclarationNode() :
-		builtin( NoBuiltinType ),
-		type( nullptr ),
-		inLine( false ),
-		bitfieldWidth( nullptr ),
-		hasEllipsis( false ),
-		linkage( ::linkage ),
-		asmName( nullptr ),
-		initializer( nullptr ),
-		extension( false ),
-		asmStmt( nullptr ) {
+	linkage( ::linkage ) {
 
 //	variable.name = nullptr;
@@ -1004,25 +995,26 @@
 				//   struct T;            // anonymous member
 				// };
-				if ( ! (extracted && decl->name == "" && ! anon) ) {
-					if (decl->name == "") {
+				if ( ! (extracted && decl->name == "" && ! anon && ! cur->get_inLine()) ) {
+					if ( decl->name == "" ) {
 						if ( DeclarationWithType * dwt = dynamic_cast<DeclarationWithType *>( decl ) ) {
 							if ( ReferenceToType * aggr = dynamic_cast<ReferenceToType *>( dwt->get_type() ) ) {
 								if ( aggr->name.find("anonymous") == std::string::npos ) {
-									if ( ! cur->inLine ) {
-										// temporary: warn about anonymous member declarations of named types, since this conflicts with the syntax for the forward declaration of an anonymous type
+									if ( ! cur->get_inLine() ) {
+										// temporary: warn about anonymous member declarations of named types, since
+										// this conflicts with the syntax for the forward declaration of an anonymous type
 										SemanticWarning( cur->location, Warning::AggrForwardDecl, aggr->name.c_str() );
-									}
-								}
-							}
-						}
-					}
+									} // if
+								} // if
+							} // if
+						} // if
+					} // if
 					decl->location = cur->location;
-					* out++ = decl;
-				}
+					*out++ = decl;
+				} // if
 			} // if
 		} catch( SemanticErrorException &e ) {
 			errors.append( e );
 		} // try
-	} // while
+	} // for
 
 	if ( ! errors.isEmpty() ) {
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 679a2609d317ee3840e5702dbd73842c77514621)
+++ src/Parser/ParseNode.h	(revision e07caa205c9b4722ae70dd338e75f6c51cd6adf9)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Jul 18 17:35:55 2018
-// Update Count     : 844
+// Last Modified On : Thu Jul 19 15:55:26 2018
+// Update Count     : 848
 //
 
@@ -303,4 +303,7 @@
 	bool get_extension() const { return extension; }
 	DeclarationNode * set_extension( bool exten ) { extension = exten; return this; }
+
+	bool get_inLine() const { return inLine; }
+	DeclarationNode * set_inLine( bool inL ) { inLine = inL; return this; }
   public:
 	DeclarationNode * get_last() { return (DeclarationNode *)ParseNode::get_last(); }
@@ -327,22 +330,22 @@
 	StaticAssert_t assert;
 
-	BuiltinType builtin;
-
-	TypeData * type;
-
-	bool inLine;
+	BuiltinType builtin = NoBuiltinType;
+
+	TypeData * type = nullptr;
+
+	bool inLine = false;
 	Type::FuncSpecifiers funcSpecs;
 	Type::StorageClasses storageClasses;
 
-	ExpressionNode * bitfieldWidth;
+	ExpressionNode * bitfieldWidth = nullptr;
 	std::unique_ptr<ExpressionNode> enumeratorValue;
-	bool hasEllipsis;
+	bool hasEllipsis = false;
 	LinkageSpec::Spec linkage;
-	Expression * asmName;
+	Expression * asmName = nullptr;
 	std::list< Attribute * > attributes;
-	InitializerNode * initializer;
+	InitializerNode * initializer = nullptr;
 	bool extension = false;
 	std::string error;
-	StatementNode * asmStmt;
+	StatementNode * asmStmt = nullptr;
 
 	static UniqueName anonymous;
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 679a2609d317ee3840e5702dbd73842c77514621)
+++ src/Parser/parser.yy	(revision e07caa205c9b4722ae70dd338e75f6c51cd6adf9)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Jul 19 10:21:43 2018
-// Update Count     : 3808
+// Last Modified On : Thu Jul 19 16:42:16 2018
+// Update Count     : 3820
 //
 
@@ -114,4 +114,11 @@
 	} // for
 } // distExt
+
+void distInl( DeclarationNode * declaration ) {
+	// distribute EXTENSION across all declarations
+	for ( DeclarationNode *iter = declaration; iter != nullptr; iter = (DeclarationNode *)iter->get_next() ) {
+		iter->set_inLine( true );
+	} // for
+} // distInl
 
 void distQual( DeclarationNode * declaration, DeclarationNode * qualifiers ) {
@@ -338,5 +345,5 @@
 %type<decl> exception_declaration
 
-%type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declarator field_abstract_list field_abstract_opt
+%type<decl> field_declaration_list_opt field_declaration field_declaring_list_opt field_declarator field_abstract_list_opt field_abstract
 %type<en> field field_name_list field_name fraction_constants_opt
 
@@ -1938,5 +1945,5 @@
 			if ( $2 ) {									// field declarator ?
 				$$ = distAttr( $1, $2 );
-			} else if ( $1->type && $1->type->kind == TypeData::Aggregate && $1->type->aggregate.anon ) {
+			} else if ( $1->type && $1->type->kind == TypeData::Aggregate ) {
 				$$ = DeclarationNode::newName( nullptr );
 				$$ = distAttr( $1, $$ );				// mark all fields in list
@@ -1960,8 +1967,9 @@
 			} // if
 		}
-	| INLINE type_specifier field_abstract_list ';'		// CFA
+	| INLINE type_specifier field_abstract_list_opt ';'	// CFA
 		{
 			$3->inLine = true;
 			$$ = distAttr( $2, $3 );					// mark all fields in list
+			distInl( $3 );
 		}
 	| typedef_declaration ';'							// CFA
@@ -1984,5 +1992,5 @@
 
 field_declarator:
-	bit_subrange_size									// no field name
+	bit_subrange_size									// C special case, no field name
 		{ $$ = DeclarationNode::newBitfield( $1 ); }
 	| variable_declarator bit_subrange_size_opt
@@ -1994,17 +2002,15 @@
 	;
 
-field_abstract_list:
-	field_abstract_opt
-	| field_abstract_list ',' attribute_list_opt field_abstract_opt
-		{ $$ = $1->appendList( $4->addQualifiers( $3 ) ); }
-	;
-
-field_abstract_opt:
+field_abstract_list_opt:
 	// empty
 		{ $$ = DeclarationNode::newName( nullptr ); }
-	| bit_subrange_size									// no field name
-		// A semantic check is required to ensure bit_subrange only appears on integral types.
-		{ $$ = DeclarationNode::newBitfield( $1 ); }
-	| variable_abstract_declarator
+	| field_abstract
+	| field_abstract_list_opt ',' attribute_list_opt field_abstract
+		{ $$ = $1->appendList( $4->addQualifiers( $3 ) ); }
+	;
+
+field_abstract:
+	// 	no bit fields
+	variable_abstract_declarator
 	;
 
