Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/CodeGen/CodeGenerator.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -826,4 +826,27 @@
 		expr->expr->accept( *visitor );
 	}
+
+	void CodeGenerator::postvisit( GenericExpr * expr ) {
+		assertf( ! genC, "C11 _Generic expressions should not reach code generation." );
+		output << "_Generic(";
+		expr->control->accept( *visitor );
+		output << ", ";
+		unsigned int numAssocs = expr->associations.size();
+		unsigned int i = 0;
+		for ( GenericExpr::Association & assoc : expr->associations ) {
+			if (assoc.isDefault) {
+				output << "default: ";
+			} else {
+				output << genType( assoc.type, "", pretty, genC ) << ": ";
+			}
+			assoc.expr->accept( *visitor );
+			if ( i+1 != numAssocs ) {
+				output << ", ";
+			}
+			i++;
+		}
+		output << ")";
+	}
+
 
 	// *** Statements
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/CodeGen/CodeGenerator.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -94,4 +94,5 @@
 		void postvisit( ConstructorExpr * );
 		void postvisit( DeletedExpr * );
+		void postvisit( GenericExpr * );
 
 		//*** Statements
Index: src/Common/PassVisitor.h
===================================================================
--- src/Common/PassVisitor.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/Common/PassVisitor.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -125,4 +125,5 @@
 	virtual void visit( InitExpr *  initExpr ) override final;
 	virtual void visit( DeletedExpr *  delExpr ) override final;
+	virtual void visit( GenericExpr * genExpr ) override final;
 
 	virtual void visit( VoidType * basicType ) override final;
@@ -223,4 +224,5 @@
 	virtual Expression * mutate( InitExpr *  initExpr ) override final;
 	virtual Expression * mutate( DeletedExpr *  delExpr ) override final;
+	virtual Expression * mutate( GenericExpr * genExpr ) override final;
 
 	virtual Type * mutate( VoidType * basicType ) override final;
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/Common/PassVisitor.impl.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -2073,4 +2073,35 @@
 
 //--------------------------------------------------------------------------
+// GenericExpr
+template< typename pass_type >
+void PassVisitor< pass_type >::visit( GenericExpr * node ) {
+	VISIT_START( node );
+
+	indexerScopedAccept( node->result, *this );
+	maybeAccept_impl( node->control, *this );
+	for ( GenericExpr::Association & assoc : node->associations ) {
+		indexerScopedAccept( assoc.type, *this );
+		maybeAccept_impl( assoc.expr, *this );
+	}
+
+	VISIT_END( node );
+}
+
+template< typename pass_type >
+Expression * PassVisitor< pass_type >::mutate( GenericExpr * node ) {
+	MUTATE_START( node );
+
+	indexerScopedMutate( node->env, *this );
+	indexerScopedMutate( node->result, *this );
+	maybeMutate_impl( node->control, *this );
+	for ( GenericExpr::Association & assoc : node->associations ) {
+		indexerScopedMutate( assoc.type, *this );
+		maybeMutate_impl( assoc.expr, *this );
+	}
+
+	MUTATE_END( Expression, node );
+}
+
+//--------------------------------------------------------------------------
 // VoidType
 template< typename pass_type >
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/Parser/parser.yy	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -175,4 +175,5 @@
 	bool flag;
 	CatchStmt::Kind catch_kind;
+	GenericExpr * genexpr;
 }
 
@@ -259,4 +260,5 @@
 %type<flag> asm_volatile_opt
 %type<en> handler_predicate_opt
+%type<genexpr> generic_association generic_assoc_list
 
 // statements
@@ -501,15 +503,30 @@
 		{ SemanticError( yylloc, "Qualified name is currently unimplemented." ); $$ = nullptr; }
 	| GENERIC '(' assignment_expression ',' generic_assoc_list ')' // C11
-		{ SemanticError( yylloc, "_Generic is currently unimplemented." ); $$ = nullptr; }
+		{
+			// add the missing control expression to the GenericExpr and return it
+			$5->control = maybeMoveBuild<Expression>( $3 );
+			$$ = new ExpressionNode( $5 );
+		}
 	;
 
 generic_assoc_list:										// C11
-	| generic_association
+	generic_association
 	| generic_assoc_list ',' generic_association
+		{
+			// steal the association node from the singleton and delete the wrapper
+			$1->associations.splice($1->associations.end(), $3->associations);
+			delete $3;
+			$$ = $1;
+		}
 	;
 
 generic_association:									// C11
 	type_no_function ':' assignment_expression
+		{
+			// create a GenericExpr wrapper with one association pair
+			$$ = new GenericExpr( nullptr, { { maybeMoveBuildType($1), maybeMoveBuild<Expression>($3) } } );
+		}
 	| DEFAULT ':' assignment_expression
+		{ $$ = new GenericExpr( nullptr, { { maybeMoveBuild<Expression>($3) } } ); }
 	;
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -97,4 +97,5 @@
 		void postvisit( InitExpr * initExpr );
 		void postvisit( DeletedExpr * delExpr );
+		void postvisit( GenericExpr * genExpr );
 
 		/// Adds alternatives for anonymous members
@@ -1756,4 +1757,8 @@
 		assertf( false, "AlternativeFinder should never see a DeletedExpr." );
 	}
+
+	void AlternativeFinder::Finder::postvisit( GenericExpr * ) {
+		assertf( false, "_Generic is not yet supported." );
+	}
 } // namespace ResolvExpr
 
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/SynTree/Expression.cc	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -748,4 +748,38 @@
 }
 
+GenericExpr::Association::Association( Type * type, Expression * expr ) : type( type ), expr( expr ), isDefault( false ) {}
+GenericExpr::Association::Association( Expression * expr ) : type( nullptr ), expr( expr ), isDefault( true ) {}
+GenericExpr::Association::Association( const Association & other ) : type( maybeClone( other.type ) ), expr( maybeClone( other.expr ) ), isDefault( other.isDefault ) {}
+GenericExpr::Association::~Association() {
+	delete type;
+	delete expr;
+}
+
+GenericExpr::GenericExpr( Expression * control, const std::list<Association> & assoc ) : Expression(), control( control ), associations( assoc ) {}
+GenericExpr::GenericExpr( const GenericExpr & other ) : Expression(other), control( maybeClone( other.control ) ), associations( other.associations ) {
+}
+GenericExpr::~GenericExpr() {
+	delete control;
+}
+
+void GenericExpr::print( std::ostream & os, Indenter indent ) const {
+	os << "C11 _Generic Expression" << std::endl << indent+1;
+	control->print( os, indent+1 );
+	os << std::endl << indent+1 << "... with associations: " << std::endl;
+	for ( const Association & assoc : associations ) {
+		os << indent+1;
+		if (assoc.isDefault) {
+			os << "... default: ";
+			assoc.expr->print( os, indent+1 );
+		} else {
+			os << "... type: ";
+			assoc.type->print( os, indent+1 );
+			os << std::endl << indent+1 << "... expression: ";
+			assoc.expr->print( os, indent+1 );
+			os << std::endl;
+		}
+		os << std::endl;
+	}
+}
 
 // Local Variables: //
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/SynTree/Expression.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -865,4 +865,32 @@
 };
 
+/// C11 _Generic expression
+class GenericExpr : public Expression {
+public:
+	struct Association {
+		Type * type = nullptr;
+		Expression * expr = nullptr;
+		bool isDefault = false;
+
+		Association( Type * type, Expression * expr );
+		Association( Expression * expr );
+		Association( const Association & other );
+		Association & operator=( const Association & other ) = delete; // at the moment this isn't used, and I don't want to implement it
+		~Association();
+	};
+
+	Expression * control;
+	std::list<Association> associations;
+
+	GenericExpr( Expression * control, const std::list<Association> & assoc );
+	GenericExpr( const GenericExpr & other );
+	virtual ~GenericExpr();
+
+	virtual GenericExpr * clone() const { return new GenericExpr( * this ); }
+	virtual void accept( Visitor & v ) { v.visit( this ); }
+	virtual Expression * acceptMutator( Mutator & m ) { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const;
+};
+
 // Local Variables: //
 // tab-width: 4 //
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/SynTree/Mutator.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -93,4 +93,5 @@
 	virtual Expression * mutate( InitExpr  * initExpr ) = 0;
 	virtual Expression * mutate( DeletedExpr * delExpr ) = 0;
+	virtual Expression * mutate( GenericExpr * genExpr ) = 0;
 
 	virtual Type * mutate( VoidType * basicType ) = 0;
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/SynTree/SynTree.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -101,4 +101,5 @@
 class InitExpr;
 class DeletedExpr;
+class GenericExpr;
 
 class Type;
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 2c8836840c17d303a057a0fe617d076c3e07bab4)
+++ src/SynTree/Visitor.h	(revision d807ca2866358a4b3b1a0171f96cffdd65420e92)
@@ -95,4 +95,5 @@
 	virtual void visit( InitExpr *  initExpr ) = 0;
 	virtual void visit( DeletedExpr * delExpr ) = 0;
+	virtual void visit( GenericExpr * genExpr ) = 0;
 
 	virtual void visit( VoidType * basicType ) = 0;
