Changeset d3d54b3 for src


Ignore:
Timestamp:
Feb 5, 2025, 1:45:29 PM (8 weeks ago)
Author:
Michael Brooks <mlbrooks@…>
Branches:
master
Children:
ab94c37
Parents:
92aeae1
Message:

Eliminate warnings due to sizeof returning type inconsistent with %zu. Fix #269.

Test

nowarn/printf-sizeof

: Activate direct test of the bug.

Tests

alloc-ERROR
extension
array-collections/dimexpr-match-c-ERRS

: Accommodate incidental changes in error-message text or generated code.

Location:
src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • TabularUnified src/AST/Expr.cpp

    r92aeae1 rd3d54b3  
    2626#include "Stmt.hpp"
    2727#include "Type.hpp"
     28#include "Util.hpp"                // for TranslationDeps
    2829#include "TypeSubstitution.hpp"
    2930#include "Common/Utility.hpp"
     
    281282
    282283SizeofExpr::SizeofExpr( const CodeLocation & loc, const Type * t )
    283 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( t ) {}
     284: Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
    284285
    285286// --- AlignofExpr
    286287
    287288AlignofExpr::AlignofExpr( const CodeLocation & loc, const Type * t )
    288 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( t ) {}
     289: Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
    289290
    290291// --- CountofExpr
    291292
    292293CountofExpr::CountofExpr( const CodeLocation & loc, const Type * t )
    293 : Expr( loc, new BasicType( BasicKind::LongUnsignedInt) ), type( t ) {}
     294: Expr( loc, ast::TranslationDeps::getSizeType() ), type( t ) {}
    294295
    295296// --- OffsetofExpr
    296297
    297298OffsetofExpr::OffsetofExpr( const CodeLocation & loc, const Type * ty, const DeclWithType * mem )
    298 : Expr( loc, new BasicType{ BasicKind::LongUnsignedInt } ), type( ty ), member( mem ) {
     299: Expr( loc, ast::TranslationDeps::getSizeType() ), type( ty ), member( mem ) {
    299300        assert( type );
    300301        assert( member );
     
    305306OffsetPackExpr::OffsetPackExpr( const CodeLocation & loc, const StructInstType * ty )
    306307: Expr( loc, new ArrayType{
    307         new BasicType{ BasicKind::LongUnsignedInt }, nullptr, FixedLen, DynamicDim }
     308        ast::TranslationDeps::getSizeType(), nullptr, FixedLen, DynamicDim }
    308309), type( ty ) {
    309310        assert( type );
  • TabularUnified src/AST/Type.hpp

    r92aeae1 rd3d54b3  
    344344struct TypeEnvKey;
    345345
    346 /// instance of named type alias (typedef or variable)
     346/// instance of named type alias (typedef, variable, or even, just after parsing, the name of a struct)
    347347class TypeInstType final : public BaseInstType {
    348348public:
  • TabularUnified src/AST/Util.cpp

    r92aeae1 rd3d54b3  
    2222#include "Common/Utility.hpp"
    2323#include "GenPoly/ScopedSet.hpp"
     24#include "Decl.hpp"
     25#include "Type.hpp"
    2426
    2527#include <vector>
     
    382384}
    383385
     386namespace {
     387        const TranslationUnit * transUnit = 0;
     388}
     389
     390void TranslationDeps::evolve( TranslationUnit & u ) {
     391        transUnit = &u;
     392}
     393
     394const ast::Type * TranslationDeps::getSizeType() {
     395        static const ast::Type * zd_abstract = new TypeInstType{ "size_t", TypeDecl::Kind::Dtype };
     396        static const ast::Type * ld_concrete = new BasicType( BasicKind::LongUnsignedInt );
     397        if ( ! transUnit ) {
     398                // early state
     399                // as if `size_t` in program text were freshly parsed
     400                return zd_abstract;
     401        } else if ( transUnit->global.sizeType ) {
     402                // late state, normal run
     403                // whatever size_t was defined as
     404                return transUnit->global.sizeType;
     405        } else {
     406                // late state, no prelude (-n)
     407                // placeholder: cfa-cpp is being used experimentally, stay out of the way
     408                return ld_concrete;
     409        }
     410}
     411
     412
    384413} // namespace ast
  • TabularUnified src/AST/Util.hpp

    r92aeae1 rd3d54b3  
    1616#pragma once
    1717
     18#include "Fwd.hpp"
     19
    1820namespace ast {
    1921
     
    2224/// Check anything that should always be true of the AST between passes.
    2325/// Insert this whenever you want additional debugging checks.
    24 void checkInvariants( TranslationUnit & transUnit );
     26void checkInvariants( TranslationUnit & );
     27
     28/// Maintains an AST-module state for contextual information needed in
     29/// ast::* implementations, notably constructors:
     30///    early: while parsing, use bootstrap versions
     31///    late: once a whole TranslationUnit exists, use its answers
     32/// When the program is in the later state, ast::* construcors effectively get
     33/// the benefit of WithTranslationUnit, without having to pass them one.
     34class TranslationDeps {
     35
     36    TranslationDeps() = delete;
     37
     38    friend class SizeofExpr;
     39    friend class AlignofExpr;
     40    friend class CountofExpr;
     41    friend class OffsetofExpr;
     42    friend class OffsetPackExpr;
     43
     44    /// Appropriate return type for built-in expressions that report on sizes
     45    static const Type * getSizeType();
     46
     47  public:
     48    /// Transition from early to late states
     49    static void evolve( TranslationUnit & );
     50};
    2551
    2652}
  • TabularUnified src/main.cpp

    r92aeae1 rd3d54b3  
    199199                Stats::Time::StopBlock();
    200200
     201                ast::TranslationDeps::evolve( transUnit );
     202
    201203                PASS( "Hoist Type Decls", Validate::hoistTypeDecls, transUnit );
    202204
Note: See TracChangeset for help on using the changeset viewer.