Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision 9380add3196da589b11c65e5e57dfd5a426cf9b2)
+++ src/Parser/DeclarationNode.cc	(revision fcd1a4697fe82bfe98a2d01862e17f49fc098216)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 12:34:05 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Mar 23 08:44:08 2021
-// Update Count     : 1149
+// Last Modified On : Wed Jul 14 17:36:57 2021
+// Update Count     : 1154
 //
 
@@ -385,4 +385,11 @@
 	newnode->type = new TypeData( basetypeof ? TypeData::Basetypeof : TypeData::Typeof );
 	newnode->type->typeexpr = expr;
+	return newnode;
+}
+
+DeclarationNode * DeclarationNode::newVtableType( DeclarationNode * decl ) {
+	DeclarationNode * newnode = new DeclarationNode;
+	newnode->type = new TypeData( TypeData::Vtable );
+	newnode->setBase( decl->type );
 	return newnode;
 }
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 9380add3196da589b11c65e5e57dfd5a426cf9b2)
+++ src/Parser/ParseNode.h	(revision fcd1a4697fe82bfe98a2d01862e17f49fc098216)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 12 15:19:04 2021
-// Update Count     : 897
+// Last Modified On : Wed Jul 14 17:28:53 2021
+// Update Count     : 900
 //
 
@@ -249,4 +249,5 @@
 	static DeclarationNode * newTuple( DeclarationNode * members );
 	static DeclarationNode * newTypeof( ExpressionNode * expr, bool basetypeof = false );
+	static DeclarationNode * newVtableType( DeclarationNode * expr );
 	static DeclarationNode * newAttribute( const std::string *, ExpressionNode * expr = nullptr ); // gcc attributes
 	static DeclarationNode * newDirectiveStmt( StatementNode * stmt ); // gcc external directive statement
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 9380add3196da589b11c65e5e57dfd5a426cf9b2)
+++ src/Parser/TypeData.cc	(revision fcd1a4697fe82bfe98a2d01862e17f49fc098216)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 16 07:56:46 2019
-// Update Count     : 662
+// Last Modified On : Wed Jul 14 17:46:47 2021
+// Update Count     : 671
 //
 
@@ -100,4 +100,6 @@
 		typeexpr = nullptr;
 		break;
+	  case Vtable:
+		break;
 	  case Builtin:
 		// builtin = new Builtin_t;
@@ -170,4 +172,6 @@
 		// delete typeexpr->expr;
 		delete typeexpr;
+		break;
+	  case Vtable:
 		break;
 	  case Builtin:
@@ -249,4 +253,6 @@
 	  case Basetypeof:
 		newtype->typeexpr = maybeClone( typeexpr );
+		break;
+	  case Vtable:
 		break;
 	  case Builtin:
@@ -467,4 +473,5 @@
 	  case Basetypeof:
 	  case Builtin:
+	  case Vtable:
 		assertf(false, "Tried to get leaf name from kind without a name: %d", kind);
 		break;
@@ -546,4 +553,6 @@
 	  case TypeData::Basetypeof:
 		return buildTypeof( td );
+	  case TypeData::Vtable:
+		return buildVtable( td );
 	  case TypeData::Builtin:
 		switch ( td->builtintype ) {
@@ -950,4 +959,10 @@
 
 
+VTableType * buildVtable( const TypeData * td ) {
+	assert( td->base );
+	return new VTableType{ buildQualifiers( td ), typebuild( td->base ) };
+} // buildVtable
+
+
 Declaration * buildDecl( const TypeData * td, const string &name, Type::StorageClasses scs, Expression * bitfieldWidth, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec linkage, Expression *asmName, Initializer * init, std::list< Attribute * > attributes ) {
 	if ( td->kind == TypeData::Function ) {
Index: src/Parser/TypeData.h
===================================================================
--- src/Parser/TypeData.h	(revision 9380add3196da589b11c65e5e57dfd5a426cf9b2)
+++ src/Parser/TypeData.h	(revision fcd1a4697fe82bfe98a2d01862e17f49fc098216)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:18:36 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Mar 27 09:05:35 2021
-// Update Count     : 200
+// Last Modified On : Wed Jul 14 17:44:05 2021
+// Update Count     : 202
 //
 
@@ -27,5 +27,5 @@
 struct TypeData {
 	enum Kind { Basic, Pointer, Reference, Array, Function, Aggregate, AggregateInst, Enum, EnumConstant, Symbolic,
-				SymbolicInst, Tuple, Typeof, Basetypeof, Builtin, GlobalScope, Qualified, Unknown };
+				SymbolicInst, Tuple, Typeof, Basetypeof, Vtable, Builtin, GlobalScope, Qualified, Unknown };
 
 	struct Aggregate_t {
@@ -128,4 +128,5 @@
 TupleType * buildTuple( const TypeData * );
 TypeofType * buildTypeof( const TypeData * );
+VTableType * buildVtable( const TypeData * );
 Declaration * buildDecl( const TypeData *, const std::string &, Type::StorageClasses, Expression *, Type::FuncSpecifiers funcSpec, LinkageSpec::Spec, Expression * asmName,
 						 Initializer * init = nullptr, std::list< class Attribute * > attributes = std::list< class Attribute * >() );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 9380add3196da589b11c65e5e57dfd5a426cf9b2)
+++ src/Parser/parser.yy	(revision fcd1a4697fe82bfe98a2d01862e17f49fc098216)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jun 29 09:12:47 2021
-// Update Count     : 5027
+// Last Modified On : Wed Jul 14 17:27:54 2021
+// Update Count     : 5030
 //
 
@@ -1923,6 +1923,7 @@
 
 vtable:
-	VTABLE '(' type_list ')' default_opt
-		{ SemanticError( yylloc, "vtable is currently unimplemented." ); $$ = nullptr; }
+	VTABLE '(' typedef_name ')' default_opt
+		{ $$ = DeclarationNode::newVtableType( $3 ); }
+		// { SemanticError( yylloc, "vtable is currently unimplemented." ); $$ = nullptr; }
 	;
 
