aboutsummaryrefslogtreecommitdiff
path: root/gcc/d/dmd/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/d/dmd/init.c')
-rw-r--r--gcc/d/dmd/init.c282
1 files changed, 0 insertions, 282 deletions
diff --git a/gcc/d/dmd/init.c b/gcc/d/dmd/init.c
deleted file mode 100644
index d18e054..0000000
--- a/gcc/d/dmd/init.c
+++ /dev/null
@@ -1,282 +0,0 @@
-
-/* Compiler implementation of the D programming language
- * Copyright (C) 1999-2021 by The D Language Foundation, All Rights Reserved
- * written by Walter Bright
- * http://www.digitalmars.com
- * Distributed under the Boost Software License, Version 1.0.
- * http://www.boost.org/LICENSE_1_0.txt
- * https://github.com/D-Programming-Language/dmd/blob/master/src/init.c
- */
-
-#include "root/dsystem.h"
-#include "root/checkedint.h"
-
-#include "mars.h"
-#include "init.h"
-#include "expression.h"
-#include "statement.h"
-#include "identifier.h"
-#include "declaration.h"
-#include "aggregate.h"
-#include "scope.h"
-#include "mtype.h"
-#include "hdrgen.h"
-#include "template.h"
-#include "id.h"
-#include "tokens.h"
-
-/********************************** Initializer *******************************/
-
-Initializer::Initializer(Loc loc)
-{
- this->loc = loc;
-}
-
-Initializers *Initializer::arraySyntaxCopy(Initializers *ai)
-{
- Initializers *a = NULL;
- if (ai)
- {
- a = new Initializers();
- a->setDim(ai->length);
- for (size_t i = 0; i < a->length; i++)
- (*a)[i] = (*ai)[i]->syntaxCopy();
- }
- return a;
-}
-
-const char *Initializer::toChars()
-{
- OutBuffer buf;
- HdrGenState hgs;
- ::toCBuffer(this, &buf, &hgs);
- return buf.extractChars();
-}
-
-/********************************** ErrorInitializer ***************************/
-
-ErrorInitializer::ErrorInitializer()
- : Initializer(Loc())
-{
-}
-
-Initializer *ErrorInitializer::syntaxCopy()
-{
- return this;
-}
-
-/********************************** VoidInitializer ***************************/
-
-VoidInitializer::VoidInitializer(Loc loc)
- : Initializer(loc)
-{
- type = NULL;
-}
-
-Initializer *VoidInitializer::syntaxCopy()
-{
- return new VoidInitializer(loc);
-}
-
-/********************************** StructInitializer *************************/
-
-StructInitializer::StructInitializer(Loc loc)
- : Initializer(loc)
-{
-}
-
-Initializer *StructInitializer::syntaxCopy()
-{
- StructInitializer *ai = new StructInitializer(loc);
- assert(field.length == value.length);
- ai->field.setDim(field.length);
- ai->value.setDim(value.length);
- for (size_t i = 0; i < field.length; i++)
- {
- ai->field[i] = field[i];
- ai->value[i] = value[i]->syntaxCopy();
- }
- return ai;
-}
-
-void StructInitializer::addInit(Identifier *field, Initializer *value)
-{
- //printf("StructInitializer::addInit(field = %p, value = %p)\n", field, value);
- this->field.push(field);
- this->value.push(value);
-}
-
-/********************************** ArrayInitializer ************************************/
-
-ArrayInitializer::ArrayInitializer(Loc loc)
- : Initializer(loc)
-{
- dim = 0;
- type = NULL;
- sem = false;
-}
-
-Initializer *ArrayInitializer::syntaxCopy()
-{
- //printf("ArrayInitializer::syntaxCopy()\n");
- ArrayInitializer *ai = new ArrayInitializer(loc);
- assert(index.length == value.length);
- ai->index.setDim(index.length);
- ai->value.setDim(value.length);
- for (size_t i = 0; i < ai->value.length; i++)
- {
- ai->index[i] = index[i] ? index[i]->syntaxCopy() : NULL;
- ai->value[i] = value[i]->syntaxCopy();
- }
- return ai;
-}
-
-void ArrayInitializer::addInit(Expression *index, Initializer *value)
-{
- this->index.push(index);
- this->value.push(value);
- dim = 0;
- type = NULL;
-}
-
-bool ArrayInitializer::isAssociativeArray()
-{
- for (size_t i = 0; i < value.length; i++)
- {
- if (index[i])
- return true;
- }
- return false;
-}
-
-/********************************
- * If possible, convert array initializer to associative array initializer.
- */
-
-Expression *ArrayInitializer::toAssocArrayLiteral()
-{
- Expression *e;
-
- //printf("ArrayInitializer::toAssocArrayInitializer()\n");
- //static int i; if (++i == 2) halt();
- Expressions *keys = new Expressions();
- keys->setDim(value.length);
- Expressions *values = new Expressions();
- values->setDim(value.length);
-
- for (size_t i = 0; i < value.length; i++)
- {
- e = index[i];
- if (!e)
- goto Lno;
- (*keys)[i] = e;
-
- Initializer *iz = value[i];
- if (!iz)
- goto Lno;
- e = initializerToExpression(iz);
- if (!e)
- goto Lno;
- (*values)[i] = e;
- }
- e = new AssocArrayLiteralExp(loc, keys, values);
- return e;
-
-Lno:
- delete keys;
- delete values;
- error(loc, "not an associative array initializer");
- return new ErrorExp();
-}
-
-/********************************** ExpInitializer ************************************/
-
-ExpInitializer::ExpInitializer(Loc loc, Expression *exp)
- : Initializer(loc)
-{
- this->exp = exp;
- this->expandTuples = false;
-}
-
-Initializer *ExpInitializer::syntaxCopy()
-{
- return new ExpInitializer(loc, exp->syntaxCopy());
-}
-
-#if 1 // should be removed and rely on ctfeInterpreter()
-bool arrayHasNonConstPointers(Expressions *elems);
-
-bool hasNonConstPointers(Expression *e)
-{
- if (e->type->ty == Terror)
- return false;
-
- if (e->op == TOKnull)
- return false;
- if (e->op == TOKstructliteral)
- {
- StructLiteralExp *se = (StructLiteralExp *)e;
- return arrayHasNonConstPointers(se->elements);
- }
- if (e->op == TOKarrayliteral)
- {
- if (!e->type->nextOf()->hasPointers())
- return false;
- ArrayLiteralExp *ae = (ArrayLiteralExp *)e;
- return arrayHasNonConstPointers(ae->elements);
- }
- if (e->op == TOKassocarrayliteral)
- {
- AssocArrayLiteralExp *ae = (AssocArrayLiteralExp *)e;
- if (ae->type->nextOf()->hasPointers() &&
- arrayHasNonConstPointers(ae->values))
- return true;
- if (((TypeAArray *)ae->type)->index->hasPointers())
- return arrayHasNonConstPointers(ae->keys);
- return false;
- }
- if (e->op == TOKaddress)
- {
- AddrExp *ae = (AddrExp *)e;
- if (ae->e1->op == TOKstructliteral)
- {
- StructLiteralExp *se = (StructLiteralExp *)ae->e1;
- if (!(se->stageflags & stageSearchPointers))
- {
- int old = se->stageflags;
- se->stageflags |= stageSearchPointers;
- bool ret = arrayHasNonConstPointers(se->elements);
- se->stageflags = old;
- return ret;
- }
- else
- {
- return false;
- }
- }
- return true;
- }
- if (e->type->ty== Tpointer && e->type->nextOf()->ty != Tfunction)
- {
- if (e->op == TOKsymoff) // address of a global is OK
- return false;
- if (e->op == TOKint64) // cast(void *)int is OK
- return false;
- if (e->op == TOKstring) // "abc".ptr is OK
- return false;
- return true;
- }
- return false;
-}
-
-bool arrayHasNonConstPointers(Expressions *elems)
-{
- for (size_t i = 0; i < elems->length; i++)
- {
- Expression *e = (*elems)[i];
- if (e && hasNonConstPointers(e))
- return true;
- }
- return false;
-}
-#endif