Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Validate/InitializerLength.cpp

    rb6f2e7ab r91a72ef  
    2929///   int x[] = { 1, 2, 3 };
    3030///   int y[][2] = { { 1, 2, 3 }, { 1, 2, 3 } };
    31 ///   char z[] = "hello";
    3231/// here x and y are known at compile-time to have length 3, so change this into
    3332///   int x[3] = { 1, 2, 3 };
    3433///   int y[3][2] = { { 1, 2, 3 }, { 1, 2, 3 } };
    35 ///   char z[6] = "hello";
    3634struct InitializerLength {
    3735        const ast::ObjectDecl * previsit( const ast::ObjectDecl * decl );
    3836};
    3937
    40 ast::ConstantExpr * makeDimension( const ast::ObjectDecl * decl ) {
    41         if ( auto init = decl->init.as<ast::ListInit>() ) {
    42                 return ast::ConstantExpr::from_ulong( decl->location, init->size() );
    43         } else if ( auto init = decl->init.as<ast::SingleInit>() ) {
    44                 if ( auto constant = init->value.as<ast::ConstantExpr>() ) {
    45                         if ( auto type = constant->result.as<ast::ArrayType>() ) {
    46                                 if ( auto dim = type->dimension.as<ast::ConstantExpr>() ) {
    47                                         ast::ConstantExpr * dimension = ast::deepCopy( dim );
    48                                         dimension->location = decl->location;
    49                                         return dimension;
    50                                 }
    51                         }
    52                 }
    53         }
    54         return nullptr;
    55 }
    56 
    5738const ast::ObjectDecl * InitializerLength::previsit( const ast::ObjectDecl * decl ) {
    5839        if ( auto type = decl->type.as<ast::ArrayType>() ) {
    5940                if ( type->dimension ) return decl;
    60                 if ( auto dimension = makeDimension( decl ) ) {
     41                if ( auto init = decl->init.as<ast::ListInit>() ) {
    6142                        ast::ObjectDecl * mutDecl = ast::mutate( decl );
    6243                        ast::ArrayType * mutType = ast::mutate( type );
    63                         mutType->dimension = dimension;
     44                        mutType->dimension = ast::ConstantExpr::from_ulong(
     45                                mutDecl->location, init->size() );
    6446                        mutDecl->type = mutType;
    6547                        return mutDecl;
Note: See TracChangeset for help on using the changeset viewer.