diff options
Diffstat (limited to 'gcc/d/dmd/nogc.c')
-rw-r--r-- | gcc/d/dmd/nogc.c | 241 |
1 files changed, 0 insertions, 241 deletions
diff --git a/gcc/d/dmd/nogc.c b/gcc/d/dmd/nogc.c deleted file mode 100644 index 12c8b490cfb..00000000000 --- a/gcc/d/dmd/nogc.c +++ /dev/null @@ -1,241 +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/nogc.c - */ - -#include "mars.h" -#include "init.h" -#include "visitor.h" -#include "expression.h" -#include "statement.h" -#include "declaration.h" -#include "id.h" -#include "module.h" -#include "scope.h" -#include "tokens.h" -#include "aggregate.h" - -bool walkPostorder(Expression *e, StoppableVisitor *v); - -void FuncDeclaration::printGCUsage(Loc loc, const char* warn) -{ - if (!global.params.vgc) - return; - - Module *m = getModule(); - if (m && m->isRoot() && !inUnittest()) - { - message(loc, "vgc: %s", warn); - } -} - -/************************************** - * Look for GC-allocations - */ -class NOGCVisitor : public StoppableVisitor -{ -public: - FuncDeclaration *f; - bool err; - - NOGCVisitor(FuncDeclaration *f) - { - this->f = f; - this->err = false; - } - - void doCond(Expression *exp) - { - if (exp) - walkPostorder(exp, this); - } - - void visit(Expression *) - { - } - - void visit(DeclarationExp *e) - { - // Note that, walkPostorder does not support DeclarationExp today. - VarDeclaration *v = e->declaration->isVarDeclaration(); - if (v && !(v->storage_class & STCmanifest) && !v->isDataseg() && v->_init) - { - if (ExpInitializer *ei = v->_init->isExpInitializer()) - { - doCond(ei->exp); - } - } - } - - void visit(CallExp *) - { - } - - void visit(ArrayLiteralExp *e) - { - if (e->type->ty != Tarray || !e->elements || !e->elements->length) - return; - - if (f->setGC()) - { - e->error("array literal in @nogc %s `%s` may cause GC allocation", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "array literal may cause GC allocation"); - } - - void visit(AssocArrayLiteralExp *e) - { - if (!e->keys->length) - return; - - if (f->setGC()) - { - e->error("associative array literal in @nogc %s `%s` may cause GC allocation", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "associative array literal may cause GC allocation"); - } - - void visit(NewExp *e) - { - if (e->member && !e->member->isNogc() && f->setGC()) - { - // @nogc-ness is already checked in NewExp::semantic - return; - } - if (e->onstack) - return; - if (e->allocator) - return; - - if (f->setGC()) - { - e->error("cannot use `new` in @nogc %s `%s`", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "`new` causes GC allocation"); - } - - void visit(DeleteExp *e) - { - if (e->e1->op == TOKvar) - { - VarDeclaration *v = ((VarExp *)e->e1)->var->isVarDeclaration(); - if (v && v->onstack) - return; // delete for scope allocated class object - } - - Type *tb = e->e1->type->toBasetype(); - AggregateDeclaration *ad = NULL; - switch (tb->ty) - { - case Tclass: - ad = ((TypeClass *)tb)->sym; - break; - - case Tpointer: - tb = ((TypePointer *)tb)->next->toBasetype(); - if (tb->ty == Tstruct) - ad = ((TypeStruct *)tb)->sym; - break; - - default: - break; - } - if (ad && ad->aggDelete) - return; - - if (f->setGC()) - { - e->error("cannot use `delete` in @nogc %s `%s`", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "`delete` requires GC"); - } - - void visit(IndexExp* e) - { - Type *t1b = e->e1->type->toBasetype(); - if (t1b->ty == Taarray) - { - if (f->setGC()) - { - e->error("indexing an associative array in @nogc %s `%s` may cause GC allocation", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "indexing an associative array may cause GC allocation"); - } - } - - void visit(AssignExp *e) - { - if (e->e1->op == TOKarraylength) - { - if (f->setGC()) - { - e->error("setting `length` in @nogc %s `%s` may cause GC allocation", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "setting `length` may cause GC allocation"); - } - } - - void visit(CatAssignExp *e) - { - if (f->setGC()) - { - e->error("cannot use operator ~= in @nogc %s `%s`", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "operator ~= may cause GC allocation"); - } - - void visit(CatExp *e) - { - if (f->setGC()) - { - e->error("cannot use operator ~ in @nogc %s `%s`", - f->kind(), f->toPrettyChars()); - err = true; - return; - } - f->printGCUsage(e->loc, "operator ~ may cause GC allocation"); - } -}; - -Expression *checkGC(Scope *sc, Expression *e) -{ - FuncDeclaration *f = sc->func; - if (e && e->op != TOKerror && - f && sc->intypeof != 1 && !(sc->flags & SCOPEctfe) && - ((f->type->ty == Tfunction && ((TypeFunction *)f->type)->isnogc) || - (f->flags & FUNCFLAGnogcInprocess) || - global.params.vgc)) - { - NOGCVisitor gcv(f); - walkPostorder(e, &gcv); - if (gcv.err) - return new ErrorExp(); - } - return e; -} |