void VarExp::scanForNestedRef(Scope *sc) { //printf("VarExp::scanForNestedRef(%s)\n", toChars()); VarDeclaration *v = var->isVarDeclaration(); if (v) v->checkNestedReference(sc, 0); }
void visit(DeclarationExp *e) { VarDeclaration *v = e->declaration->isVarDeclaration(); if (v) { result = v->checkNestedReference(sc, Loc()); if (result) return; /* Some expressions cause the frontend to create a temporary. * For example, structs with cpctors replace the original * expression e with: * __cpcttmp = __cpcttmp.cpctor(e); * * In this instance, we need to ensure that the original * expression e does not have any nested references by * checking the declaration initializer too. */ if (v->_init && v->_init->isExpInitializer()) { Expression *ie = initializerToExpression(v->_init); result = lambdaCheckForNestedRef(ie, sc); } } }
/******************************************* * Look for references to variables in a scope enclosing the new function literal. */ int lambdaCheckForNestedRef(Expression *e, void *param) { Scope *sc = (Scope *)param; /* We could use virtual functions instead of a switch, * but it doesn't seem worth the bother. */ switch (e->op) { case TOKsymoff: { SymOffExp *se = (SymOffExp *)e; VarDeclaration *v = se->var->isVarDeclaration(); if (v) v->checkNestedReference(sc, 0); break; } case TOKvar: { VarExp *ve = (VarExp *)e; VarDeclaration *v = ve->var->isVarDeclaration(); if (v) v->checkNestedReference(sc, 0); break; } case TOKthis: case TOKsuper: { ThisExp *te = (ThisExp *)e; VarDeclaration *v = te->var->isVarDeclaration(); if (v) v->checkNestedReference(sc, 0); break; } default: break; } return 0; }
void visit(VarExp *e) { VarDeclaration *v = e->var->isVarDeclaration(); if (v) result = v->checkNestedReference(sc, Loc()); }
/******************************************* * Look for references to variables in a scope enclosing the new function literal. */ int lambdaCheckForNestedRef(Expression *e, void *param) { Scope *sc = (Scope *)param; /* We could use virtual functions instead of a switch, * but it doesn't seem worth the bother. */ switch (e->op) { case TOKsymoff: { SymOffExp *se = (SymOffExp *)e; VarDeclaration *v = se->var->isVarDeclaration(); if (v) v->checkNestedReference(sc, Loc()); break; } case TOKvar: { VarExp *ve = (VarExp *)e; VarDeclaration *v = ve->var->isVarDeclaration(); if (v) v->checkNestedReference(sc, Loc()); break; } case TOKthis: case TOKsuper: { ThisExp *te = (ThisExp *)e; VarDeclaration *v = te->var->isVarDeclaration(); if (v) v->checkNestedReference(sc, Loc()); break; } case TOKdeclaration: { DeclarationExp *de = (DeclarationExp *)e; VarDeclaration *v = de->declaration->isVarDeclaration(); if (v) { v->checkNestedReference(sc, Loc()); /* Some expressions cause the frontend to create a temporary. * For example, structs with cpctors replace the original * expression e with: * __cpcttmp = __cpcttmp.cpctor(e); * * In this instance, we need to ensure that the original * expression e does not have any nested references by * checking the declaration initializer too. */ if (v->init && v->init->isExpInitializer()) { Expression *ie = v->init->toExpression(); ie->apply (&lambdaCheckForNestedRef, param); } } break; } default: break; } return 0; }