(root)/
gcc-13.2.0/
gcc/
d/
dmd/
init.h
       1  
       2  /* Compiler implementation of the D programming language
       3   * Copyright (C) 1999-2023 by The D Language Foundation, All Rights Reserved
       4   * written by Walter Bright
       5   * https://www.digitalmars.com
       6   * Distributed under the Boost Software License, Version 1.0.
       7   * https://www.boost.org/LICENSE_1_0.txt
       8   * https://github.com/dlang/dmd/blob/master/src/dmd/init.h
       9   */
      10  
      11  #pragma once
      12  
      13  #include "ast_node.h"
      14  #include "globals.h"
      15  #include "arraytypes.h"
      16  #include "visitor.h"
      17  
      18  class Identifier;
      19  class Expression;
      20  class Type;
      21  class ErrorInitializer;
      22  class VoidInitializer;
      23  class StructInitializer;
      24  class ArrayInitializer;
      25  class ExpInitializer;
      26  class CInitializer;
      27  
      28  enum NeedInterpret { INITnointerpret, INITinterpret };
      29  
      30  class Initializer : public ASTNode
      31  {
      32  public:
      33      Loc loc;
      34      unsigned char kind;
      35  
      36      DYNCAST dyncast() const override { return DYNCAST_INITIALIZER; }
      37  
      38      const char *toChars() const override final;
      39  
      40      ErrorInitializer   *isErrorInitializer();
      41      VoidInitializer    *isVoidInitializer();
      42      StructInitializer  *isStructInitializer();
      43      ArrayInitializer   *isArrayInitializer();
      44      ExpInitializer     *isExpInitializer();
      45      CInitializer       *isCInitializer();
      46  
      47      void accept(Visitor *v) override { v->visit(this); }
      48  };
      49  
      50  class VoidInitializer final : public Initializer
      51  {
      52  public:
      53      Type *type;         // type that this will initialize to
      54  
      55      void accept(Visitor *v) override { v->visit(this); }
      56  };
      57  
      58  class ErrorInitializer final : public Initializer
      59  {
      60  public:
      61      void accept(Visitor *v) override { v->visit(this); }
      62  };
      63  
      64  class StructInitializer final : public Initializer
      65  {
      66  public:
      67      Identifiers field;  // of Identifier *'s
      68      Initializers value; // parallel array of Initializer *'s
      69  
      70      void accept(Visitor *v) override { v->visit(this); }
      71  };
      72  
      73  class ArrayInitializer final : public Initializer
      74  {
      75  public:
      76      Expressions index;  // indices
      77      Initializers value; // of Initializer *'s
      78      unsigned dim;       // length of array being initialized
      79      Type *type;         // type that array will be used to initialize
      80      d_bool sem;           // true if semantic() is run
      81      d_bool isCarray;      // C array semantics
      82  
      83      bool isAssociativeArray() const;
      84      Expression *toAssocArrayLiteral();
      85  
      86      void accept(Visitor *v) override { v->visit(this); }
      87  };
      88  
      89  class ExpInitializer final : public Initializer
      90  {
      91  public:
      92      d_bool expandTuples;
      93      Expression *exp;
      94  
      95      void accept(Visitor *v) override { v->visit(this); }
      96  };
      97  
      98  struct Designator
      99  {
     100      Expression *exp;
     101      Identifier *ident;
     102  };
     103  
     104  struct DesigInit
     105  {
     106      Designators *designatorList;
     107      Initializer *initializer;
     108  };
     109  
     110  class CInitializer final : public Initializer
     111  {
     112  public:
     113      DesigInits initializerList;
     114      Type *type;         // type that array will be used to initialize
     115      d_bool sem;           // true if semantic() is run
     116  
     117      void accept(Visitor *v) override { v->visit(this); }
     118  };
     119  
     120  Expression *initializerToExpression(Initializer *init, Type *t = NULL, const bool isCfile = false);