Mercurial > hg > CbC > CbC_gcc
diff gcc/d/dmd/enum.h @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gcc/d/dmd/enum.h Thu Feb 13 11:34:05 2020 +0900 @@ -0,0 +1,95 @@ + +/* Compiler implementation of the D programming language + * Copyright (C) 1999-2019 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/dlang/dmd/blob/master/src/dmd/enum.h + */ + +#pragma once + +#include "root/root.h" +#include "dsymbol.h" +#include "declaration.h" +#include "tokens.h" + +class Identifier; +class Type; +class Expression; +class VarDeclaration; + +class EnumDeclaration : public ScopeDsymbol +{ +public: + /* The separate, and distinct, cases are: + * 1. enum { ... } + * 2. enum : memtype { ... } + * 3. enum id { ... } + * 4. enum id : memtype { ... } + * 5. enum id : memtype; + * 6. enum id; + */ + Type *type; // the TypeEnum + Type *memtype; // type of the members + Prot protection; + + Expression *maxval; + Expression *minval; + Expression *defaultval; // default initializer + + bool isdeprecated; + bool added; + int inuse; + + EnumDeclaration(Loc loc, Identifier *id, Type *memtype); + Dsymbol *syntaxCopy(Dsymbol *s); + void addMember(Scope *sc, ScopeDsymbol *sds); + void setScope(Scope *sc); + void semantic(Scope *sc); + bool oneMember(Dsymbol **ps, Identifier *ident); + Type *getType(); + const char *kind() const; + Dsymbol *search(const Loc &loc, Identifier *ident, int flags = SearchLocalsOnly); + bool isDeprecated(); // is Dsymbol deprecated? + Prot prot(); + Expression *getMaxMinValue(Loc loc, Identifier *id); + bool isSpecial() const; + Expression *getDefaultValue(Loc loc); + Type *getMemtype(Loc loc); + + EnumDeclaration *isEnumDeclaration() { return this; } + + Symbol *sinit; + void accept(Visitor *v) { v->visit(this); } +}; + + +class EnumMember : public VarDeclaration +{ +public: + /* Can take the following forms: + * 1. id + * 2. id = value + * 3. type id = value + */ + Expression *&value(); + + // A cast() is injected to 'value' after semantic(), + // but 'origValue' will preserve the original value, + // or previous value + 1 if none was specified. + Expression *origValue; + Type *origType; + + EnumDeclaration *ed; + + EnumMember(Loc loc, Identifier *id, Expression *value, Type *origType); + Dsymbol *syntaxCopy(Dsymbol *s); + const char *kind() const; + void semantic(Scope *sc); + Expression *getVarExp(Loc loc, Scope *sc); + + EnumMember *isEnumMember() { return this; } + void accept(Visitor *v) { v->visit(this); } +};