Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Convert.cpp

    raaeacf4 r6896548  
    733733        const ast::Expr * visit( const ast::VariableExpr * node ) override final {
    734734                auto expr = new VariableExpr();
     735                expr->var = get<DeclarationWithType>().accept1(node->var);
    735736                visitBaseExpr( node, expr );
    736                 expr->var = get<DeclarationWithType>().accept1(node->var);
    737                 Type * type = expr->var->get_type()->clone();
    738                 if(FunctionType * ft = dynamic_cast<FunctionType*>(type)) {
    739                         if(node->result.as<ast::PointerType>()) {
    740                                 type = new PointerType({}, ft);
    741                         }
    742                 }
    743 
    744                 type->set_lvalue( true );
    745                 expr->result = type ;
    746737                this->node = expr;
    747738                return nullptr;
     
    766757                        break;
    767758                case ast::ConstantExpr::String:
    768                         rslt = new ConstantExpr{Constant{
    769                                 get<Type>().accept1( node->result ),
    770                                 node->rep,
    771                                 (long long unsigned int)0
    772                         }};
     759                        // Old world:   two types: rslt->constant.type, rslt->result
     760                        // New workd:   one type: node->result
     761                        // Both worlds: the outer, expression-level type can change during resolution
     762                        //              in case of string, that's char[k] before-resolve and char * after
     763                        // Old world:   the inner Constant type stays what it was built with
     764                        //              in case of string, that's char[k]
     765                        // Both worlds: the "rep" field of a string constant is the string value it was initialized from, wrapped in quotes, but not otherwise escaped
     766                        ast::ptr<ast::Type> charType = nullptr;
     767                        if (const ast::ArrayType *arrRslt = node->result.as<ast::ArrayType>()) {
     768                                charType = arrRslt->base;
     769                        } else {
     770                                const ast::PointerType *ptrRslt = node->result.as<ast::PointerType>();
     771                                assert(ptrRslt);
     772                                charType = ptrRslt->base;
     773                        }
     774                        rslt = new ConstantExpr(Constant::from_string(
     775                                node->rep, get<Type>().accept1(charType)));          // rslt->result is char[k]
     776                        rslt->set_result( get<Type>().accept1( node->result ) ); // rslt->result is [[ node->rsult ]]
    773777                        break;
    774778                }
     
    21522156                );
    21532157
    2154                 visitBaseExpr_SkipResultType( old,
    2155                         expr
    2156                 );
    2157 
    21582158                expr->var = GET_ACCEPT_1(var, DeclWithType);
    2159                 expr->result = expr->var->get_type();
    2160                 if(const ast::FunctionType * ft = expr->result.as<ast::FunctionType>()) {
    2161                         if(dynamic_cast<PointerType *>(old->result)) {
    2162                                 expr->result = new ast::PointerType(ft);
    2163                         }
    2164                 }
    2165                 add_qualifiers( expr->result, ast::CV::Lvalue );
     2159                visitBaseExpr( old, expr );
     2160
    21662161                this->node = expr;
    21672162        }
     
    21932188
    21942189        int isStringlikeConstantType(const Type *t) {
     2190                const Type *referentType = nullptr;
    21952191                if ( const ArrayType * aty = dynamic_cast< const ArrayType * >( t ) ) {
    2196                         if ( const BasicType * bty = dynamic_cast< const BasicType * >( aty->base ) ) {
     2192                        referentType = aty->base;
     2193                } else if ( const PointerType * pty = dynamic_cast< const PointerType * >( t ) ) {
     2194                        referentType = pty->base;
     2195                }
     2196                if (referentType) {
     2197                        if ( const BasicType * bty = dynamic_cast< const BasicType * >( referentType ) ) {
    21972198                           if ( bty->kind == BasicType::Kind::Char ) {
    21982199                                   return true;
     
    22052206        virtual void visit( ConstantExpr * old ) override final {
    22062207                ast::ConstantExpr *rslt = nullptr;
    2207                 if (isIntlikeConstantType(old->result)) {
     2208                if (isStringlikeConstantType(old->result)) {
     2209                        rslt = new ast::ConstantExpr(
     2210                                old->location,
     2211                                GET_ACCEPT_1(result, Type), // preserve the expression-level type (old->result, not old->constant.type); see new-to-old
     2212                                old->constant.get_value(),
     2213                                0,
     2214                                ast::ConstantExpr::Kind::String
     2215                        );
     2216                } else if (isIntlikeConstantType(old->result)) {
    22082217                        rslt = new ast::ConstantExpr(
    22092218                                old->location,
     
    22192228                                old->constant.get_value(),
    22202229                                (double) old->constant.get_dval()
    2221                         );
    2222                 } else if (isStringlikeConstantType(old->result)) {
    2223                         rslt = new ast::ConstantExpr(
    2224                                 old->location,
    2225                                 GET_ACCEPT_1(result, Type),
    2226                                 old->constant.get_value(),
    2227                                 0,
    2228                                 ast::ConstantExpr::Kind::String
    22292230                        );
    22302231                }
Note: See TracChangeset for help on using the changeset viewer.