diff --git a/executable_semantics/ast/class_definition.h b/executable_semantics/ast/class_definition.h index c65fd640dfb2..18b1e6ae171e 100644 --- a/executable_semantics/ast/class_definition.h +++ b/executable_semantics/ast/class_definition.h @@ -16,7 +16,7 @@ namespace Carbon { struct ClassDefinition { SourceLocation loc; std::string name; - std::list members; + std::list> members; }; } // namespace Carbon diff --git a/executable_semantics/ast/declaration.cpp b/executable_semantics/ast/declaration.cpp index b386853c2775..7957875a62ac 100644 --- a/executable_semantics/ast/declaration.cpp +++ b/executable_semantics/ast/declaration.cpp @@ -20,7 +20,7 @@ void Declaration::Print(llvm::raw_ostream& out) const { const ClassDefinition& class_def = cast(*this).Definition(); out << "class " << class_def.name << " {\n"; - for (Member* m : class_def.members) { + for (Ptr m : class_def.members) { out << *m; } out << "}\n"; diff --git a/executable_semantics/ast/declaration.h b/executable_semantics/ast/declaration.h index 6dca09e2d6f9..ade7b7a276c9 100644 --- a/executable_semantics/ast/declaration.h +++ b/executable_semantics/ast/declaration.h @@ -77,7 +77,7 @@ class FunctionDeclaration : public Declaration { class ClassDeclaration : public Declaration { public: ClassDeclaration(SourceLocation loc, std::string name, - std::list members) + std::list> members) : Declaration(Kind::ClassDeclaration, loc), definition({.loc = loc, .name = std::move(name), diff --git a/executable_semantics/interpreter/interpreter.cpp b/executable_semantics/interpreter/interpreter.cpp index 20024d17edc2..17bf8e6b2d5f 100644 --- a/executable_semantics/interpreter/interpreter.cpp +++ b/executable_semantics/interpreter/interpreter.cpp @@ -139,7 +139,7 @@ void InitEnv(const Declaration& d, Env* env) { const ClassDefinition& class_def = cast(d).Definition(); VarValues fields; VarValues methods; - for (const Member* m : class_def.members) { + for (Ptr m : class_def.members) { switch (m->Tag()) { case Member::Kind::FieldMember: { const BindingPattern* binding = cast(*m).Binding(); diff --git a/executable_semantics/interpreter/typecheck.cpp b/executable_semantics/interpreter/typecheck.cpp index 0bbd96d53469..630505d2c1b9 100644 --- a/executable_semantics/interpreter/typecheck.cpp +++ b/executable_semantics/interpreter/typecheck.cpp @@ -948,7 +948,7 @@ static auto TypeOfClassDef(const ClassDefinition* sd, TypeEnv /*types*/, Env ct_top) -> const Value* { VarValues fields; VarValues methods; - for (const Member* m : sd->members) { + for (Ptr m : sd->members) { switch (m->Tag()) { case Member::Kind::FieldMember: { const BindingPattern* binding = cast(*m).Binding(); @@ -1001,8 +1001,8 @@ auto MakeTypeChecked(const Ptr d, const TypeEnv& types, case Declaration::Kind::ClassDeclaration: { const ClassDefinition& class_def = cast(*d).Definition(); - std::list fields; - for (Member* m : class_def.members) { + std::list> fields; + for (Ptr m : class_def.members) { switch (m->Tag()) { case Member::Kind::FieldMember: // TODO: Interpret the type expression and store the result. diff --git a/executable_semantics/syntax/parser.ypp b/executable_semantics/syntax/parser.ypp index f35001d6d63a..9be002c79123 100644 --- a/executable_semantics/syntax/parser.ypp +++ b/executable_semantics/syntax/parser.ypp @@ -113,8 +113,8 @@ void Carbon::Parser::error(const location_type&, const std::string& message) { %type tuple %type > binding_lhs %type variable_declaration -%type member -%type > member_list +%type >> member +%type >> member_list %type ::Element> paren_expression_element %type > paren_expression_base %type > paren_expression_contents @@ -536,11 +536,11 @@ variable_declaration: identifier ":" pattern { $$ = global_arena->RawNew(context.SourceLoc(), $1, $3); } ; member: VAR variable_declaration ";" - { $$ = global_arena->RawNew(context.SourceLoc(), $2); } + { $$ = global_arena->New(context.SourceLoc(), $2); } ; member_list: // Empty - { $$ = std::list(); } + { $$ = std::list>(); } | member member_list { $$ = $2; $$.push_front($1); } ;