Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Validate/EnumAndPointerDecay.cpp

    re874605 re9e9f56  
    2121#include "AST/Type.hpp"
    2222#include "SymTab/FixFunction.h"
    23 #include "Validate/NoIdSymbolTable.hpp"
    2423
    2524namespace Validate {
     
    2726namespace {
    2827
    29 struct EnumAndPointerDecayCore final : public WithNoIdSymbolTable, public ast::WithCodeLocation {
     28struct EnumAndPointerDecayCore final : public ast::WithCodeLocation {
    3029        ast::EnumDecl const * previsit( ast::EnumDecl const * decl );
    3130        ast::FunctionDecl const * previsit( ast::FunctionDecl const * decl );
     
    4039        // Set the type of each member of the enumeration to be EnumContant.
    4140        auto mut = ast::mutate( decl );
    42         std::vector<ast::ptr<ast::Decl>> buffer;
    43         for ( auto it = decl->members.begin(); it != decl->members.end(); ++it ) {
    44                 if ( ast::ObjectDecl const * object = (*it).as<ast::ObjectDecl>() ) {
    45                         buffer.push_back( ast::mutate_field( object, &ast::ObjectDecl::type, new ast::EnumInstType( decl, ast::CV::Const ) ) );
    46                 } else if ( ast::InlineValueDecl const * value = (*it).as<ast::InlineValueDecl>() ) {
    47                         if ( auto targetEnum = symtab.lookupEnum( value->name ) ) {
    48                                 for ( auto singleMember : targetEnum->members ) {
    49                                         auto copyingMember = singleMember.as<ast::ObjectDecl>();
    50                                         buffer.push_back( new ast::ObjectDecl(
    51                                                 value->location, // use the "inline" location
    52                                                 copyingMember->name,
    53                                                 new ast::EnumInstType( decl, ast::CV::Const ),
    54                                                 // Construct a new EnumInstType as the type
    55                                                 copyingMember->init,
    56                                                 copyingMember->storage,
    57                                                 copyingMember->linkage,
    58                                                 copyingMember->bitfieldWidth,
    59                                                 {},
    60                                                 copyingMember->funcSpec
    61                                         ) );
    62                                 }
    63                         }
    64                 }
     41        for ( ast::ptr<ast::Decl> & member : mut->members ) {
     42                ast::ObjectDecl const * object = member.strict_as<ast::ObjectDecl>();
     43                member = ast::mutate_field( object, &ast::ObjectDecl::type,
     44                        new ast::EnumInstType( decl, ast::CV::Const ) );
    6545        }
    66         mut->members = buffer;
    6746        return mut;
    6847}
Note: See TracChangeset for help on using the changeset viewer.