diff --git a/dmd/statement.h b/dmd/statement.h index 4361805d..24876b7b 100644 --- a/dmd/statement.h +++ b/dmd/statement.h @@ -170,13 +170,13 @@ struct CompoundStatement : Statement CompoundStatement(Loc loc, Statements *s); CompoundStatement(Loc loc, Statement *s1, Statement *s2); - Statement *syntaxCopy(); + virtual Statement *syntaxCopy(); void toCBuffer(OutBuffer *buf, HdrGenState *hgs); Statement *semantic(Scope *sc); int usesEH(); int fallOffEnd(); int comeFrom(); - Statements *flatten(Scope *sc); + virtual Statements *flatten(Scope *sc); ReturnStatement *isReturnStatement(); Expression *interpret(InterState *istate); @@ -184,9 +184,9 @@ struct CompoundStatement : Statement Expression *doInline(InlineDoState *ids); Statement *inlineScan(InlineScanState *iss); - void toIR(IRState *irs); + virtual void toIR(IRState *irs); - CompoundStatement *isCompoundStatement() { return this; } + virtual CompoundStatement *isCompoundStatement() { return this; } }; /* The purpose of this is so that continue will go to the next @@ -795,6 +795,9 @@ struct AsmBlockStatement : CompoundStatement { AsmBlockStatement(Loc loc, Statements *s); Statements *flatten(Scope *sc); + Statement *syntaxCopy(); + + CompoundStatement *isCompoundStatement() { return NULL; } AsmBlockStatement *isAsmBlockStatement() { return this; } void toIR(IRState *irs); diff --git a/gen/asmstmt.cpp b/gen/asmstmt.cpp index 15b9653b..18f245a4 100644 --- a/gen/asmstmt.cpp +++ b/gen/asmstmt.cpp @@ -245,7 +245,6 @@ AsmStatement::toIR(IRState * irs) static std::string i_cns = "i"; static std::string p_cns = "i"; - static std::string l_cns = "X"; static std::string m_cns = "*m"; static std::string mw_cns = "=*m"; static std::string mrw_cns = "+*m"; @@ -497,6 +496,7 @@ void AsmBlockStatement::toIR(IRState* p) // create asm block structure assert(!p->asmBlock); IRAsmBlock* asmblock = new IRAsmBlock; + assert(asmblock); p->asmBlock = asmblock; // do asm statements @@ -595,3 +595,18 @@ Statements* AsmBlockStatement::flatten(Scope* sc) { return NULL; } + +Statement *AsmBlockStatement::syntaxCopy() +{ + Statements *a = new Statements(); + a->setDim(statements->dim); + for (size_t i = 0; i < statements->dim; i++) + { + Statement *s = (Statement *)statements->data[i]; + if (s) + s = s->syntaxCopy(); + a->data[i] = s; + } + AsmBlockStatement *cs = new AsmBlockStatement(loc, a); + return cs; +} \ No newline at end of file diff --git a/gen/d-asm-i386.h b/gen/d-asm-i386.h index 334b716f..edd74aae 100644 --- a/gen/d-asm-i386.h +++ b/gen/d-asm-i386.h @@ -2044,6 +2044,7 @@ struct AsmProcessor } } else if (exp->op == TOKvar) { VarDeclaration * v = ((VarExp *) exp)->var->isVarDeclaration(); + v->needsStorage = true; if (v && v->storage_class & STCfield) { operand->constDisplacement += v->offset;