本文整理汇总了C++中VarDeclaration::isDataseg方法的典型用法代码示例。如果您正苦于以下问题:C++ VarDeclaration::isDataseg方法的具体用法?C++ VarDeclaration::isDataseg怎么用?C++ VarDeclaration::isDataseg使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类VarDeclaration
的用法示例。
在下文中一共展示了VarDeclaration::isDataseg方法的14个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: expressionInlineCost
int DeclarationExp::inlineCost3(InlineCostState *ics)
{ int cost = 0;
VarDeclaration *vd;
//printf("DeclarationExp::inlineCost3()\n");
vd = declaration->isVarDeclaration();
if (vd)
{
TupleDeclaration *td = vd->toAlias()->isTupleDeclaration();
if (td)
{
#if 1
return COST_MAX; // finish DeclarationExp::doInline
#else
for (size_t i = 0; i < td->objects->dim; i++)
{ Object *o = (*td->objects)[i];
if (o->dyncast() != DYNCAST_EXPRESSION)
return COST_MAX;
Expression *eo = (Expression *)o;
if (eo->op != TOKdsymbol)
return COST_MAX;
}
return td->objects->dim;
#endif
}
if (!ics->hdrscan && vd->isDataseg())
return COST_MAX;
cost += 1;
#if DMDV2
if (vd->edtor) // if destructor required
return COST_MAX; // needs work to make this work
#endif
// Scan initializer (vd->init)
if (vd->init)
{
ExpInitializer *ie = vd->init->isExpInitializer();
if (ie)
{
cost += expressionInlineCost(ie->exp, ics);
}
}
}
// These can contain functions, which when copied, get output twice.
if (declaration->isStructDeclaration() ||
declaration->isClassDeclaration() ||
declaration->isFuncDeclaration() ||
declaration->isTypedefDeclaration() ||
#if DMDV2
declaration->isAttribDeclaration() ||
#endif
declaration->isTemplateMixin())
return COST_MAX;
//printf("DeclarationExp::inlineCost3('%s')\n", toChars());
return cost;
}
示例2: inlineCost
int DeclarationExp::inlineCost(InlineCostState *ics)
{ int cost = 0;
VarDeclaration *vd;
//printf("DeclarationExp::inlineCost()\n");
vd = declaration->isVarDeclaration();
if (vd)
{
TupleDeclaration *td = vd->toAlias()->isTupleDeclaration();
if (td)
{
#if 1
return COST_MAX; // finish DeclarationExp::doInline
#else
for (size_t i = 0; i < td->objects->dim; i++)
{ Object *o = (*td->objects)[i];
if (o->dyncast() != DYNCAST_EXPRESSION)
return COST_MAX;
Expression *eo = (Expression *)o;
if (eo->op != TOKdsymbol)
return COST_MAX;
}
return td->objects->dim;
#endif
}
// This breaks on LDC too, since nested static variables have internal
// linkage and thus can't be referenced from other objects.
if (!ics->hdrscan && vd->isDataseg())
return COST_MAX;
cost += 1;
// Scan initializer (vd->init)
if (vd->init)
{
ExpInitializer *ie = vd->init->isExpInitializer();
if (ie)
{
cost += ie->exp->inlineCost(ics);
}
}
}
// These can contain functions, which when copied, get output twice.
// These break on LDC too, since nested static variables and functions have
// internal linkage and thus can't be referenced from other objects.
if (declaration->isStructDeclaration() ||
declaration->isClassDeclaration() ||
declaration->isFuncDeclaration() ||
declaration->isTypedefDeclaration() ||
declaration->isTemplateMixin())
return COST_MAX;
//printf("DeclarationExp::inlineCost('%s')\n", toChars());
return cost;
}
示例3: check
void check(Loc loc, Declaration *d)
{
assert(d);
VarDeclaration *v = d->isVarDeclaration();
if (v && v->toParent2() == sc->func)
{
if (v->isDataseg())
return;
if ((v->storage_class & (STCref | STCout)) == 0)
{
error(loc, "escaping reference to local variable %s", v);
return;
}
if (global.params.useDIP25 &&
(v->storage_class & (STCref | STCout)) && !(v->storage_class & (STCreturn | STCforeach)))
{
if (sc->func->flags & FUNCFLAGreturnInprocess)
{
//printf("inferring 'return' for variable '%s'\n", v->toChars());
v->storage_class |= STCreturn;
if (v == sc->func->vthis)
{
TypeFunction *tf = (TypeFunction *)sc->func->type;
if (tf->ty == Tfunction)
{
//printf("'this' too\n");
tf->isreturn = true;
}
}
}
else if (sc->module && sc->module->isRoot())
{
//printf("escaping reference to local ref variable %s\n", v->toChars());
//printf("storage class = x%llx\n", v->storage_class);
error(loc, "escaping reference to local ref variable %s", v);
}
return;
}
if (v->storage_class & STCref &&
v->storage_class & (STCforeach | STCtemp) &&
v->init)
{
// (ref v = ex; ex)
if (ExpInitializer *ez = v->init->isExpInitializer())
{
assert(ez->exp && ez->exp->op == TOKconstruct);
Expression *ex = ((ConstructExp *)ez->exp)->e2;
ex->accept(this);
return;
}
}
}
}
示例4: visit
void visit(DeclarationExp *e)
{
//printf("DeclarationExp::inlineCost3()\n");
VarDeclaration *vd = e->declaration->isVarDeclaration();
if (vd)
{
TupleDeclaration *td = vd->toAlias()->isTupleDeclaration();
if (td)
{
cost = COST_MAX; // finish DeclarationExp::doInline
return;
}
if (!hdrscan && vd->isDataseg())
{
cost = COST_MAX;
return;
}
if (vd->edtor)
{
// if destructor required
// needs work to make this work
cost = COST_MAX;
return;
}
// Scan initializer (vd->init)
if (vd->_init)
{
ExpInitializer *ie = vd->_init->isExpInitializer();
if (ie)
{
expressionInlineCost(ie->exp);
}
}
cost += 1;
}
// These can contain functions, which when copied, get output twice.
if (e->declaration->isStructDeclaration() ||
e->declaration->isClassDeclaration() ||
e->declaration->isFuncDeclaration() ||
e->declaration->isAttribDeclaration() ||
e->declaration->isTemplateMixin())
{
cost = COST_MAX;
return;
}
//printf("DeclarationExp::inlineCost3('%s')\n", toChars());
}
示例5: visit
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 (v->init->isVoidInitializer())
{
}
else
{
ExpInitializer *ei = v->init->isExpInitializer();
assert(ei);
doCond(ei->exp);
}
}
}
示例6: checkThrowEscape
/************************************
* Detect cases where pointers to the stack can 'escape' the
* lifetime of the stack frame when throwing `e`.
* Print error messages when these are detected.
* Params:
* sc = used to determine current function and module
* e = expression to check for any pointers to the stack
* gag = do not print error messages
* Returns:
* true if pointers to the stack can escape
*/
bool checkThrowEscape(Scope *sc, Expression *e, bool gag)
{
//printf("[%s] checkThrowEscape, e = %s\n", e->loc->toChars(), e->toChars());
EscapeByResults er;
escapeByValue(e, &er);
if (!er.byref.dim && !er.byvalue.dim && !er.byexp.dim)
return false;
bool result = false;
for (size_t i = 0; i < er.byvalue.dim; i++)
{
VarDeclaration *v = er.byvalue[i];
//printf("byvalue %s\n", v->toChars());
if (v->isDataseg())
continue;
if (v->isScope())
{
if (sc->_module && sc->_module->isRoot())
{
// Only look for errors if in module listed on command line
if (global.params.vsafe) // https://issues.dlang.org/show_bug.cgi?id=17029
{
if (!gag)
error(e->loc, "scope variable %s may not be thrown", v->toChars());
result = true;
}
continue;
}
}
else
{
//printf("no infer for %s\n", v->toChars());
v->doNotInferScope = true;
}
}
return result;
}
示例7: calcZeroInit
int StructDeclaration::calcZeroInit()
{
// Determine if struct is all zeros or not
for (size_t i = 0; i < fields.dim; i++)
{
Dsymbol *s = fields[i];
VarDeclaration *vd = s->isVarDeclaration();
if (vd && !vd->isDataseg())
{
if (vd->init)
{
// Should examine init to see if it is really all 0's
return 0;
}
else if (!vd->type->isZeroInit(loc))
{
return 0;
}
}
}
return 1;
}
示例8: checkParamArgumentEscape
/****************************************
* Function parameter par is being initialized to arg,
* and par may escape.
* Detect if scoped values can escape this way.
* Print error messages when these are detected.
* Params:
* sc = used to determine current function and module
* par = identifier of function parameter
* arg = initializer for param
* gag = do not print error messages
* Returns:
* true if pointers to the stack can escape via assignment
*/
bool checkParamArgumentEscape(Scope *sc, FuncDeclaration *fdc, Identifier *par, Expression *arg, bool gag)
{
//printf("checkParamArgumentEscape(arg: %s par: %s)\n", arg->toChars(), par->toChars());
//printf("type = %s, %d\n", arg->type->toChars(), arg->type->hasPointers());
if (!arg->type->hasPointers())
return false;
EscapeByResults er;
escapeByValue(arg, &er);
if (!er.byref.dim && !er.byvalue.dim && !er.byfunc.dim && !er.byexp.dim)
return false;
bool result = false;
for (size_t i = 0; i < er.byvalue.dim; i++)
{
//printf("byvalue %s\n", v->toChars());
VarDeclaration *v = er.byvalue[i];
if (v->isDataseg())
continue;
Dsymbol *p = v->toParent2();
v->storage_class &= ~STCmaybescope;
if (v->isScope())
{
unsafeAssign(sc, fdc, par, arg, gag, result, v, "scope variable");
}
else if (v->storage_class & STCvariadic && p == sc->func)
{
Type *tb = v->type->toBasetype();
if (tb->ty == Tarray || tb->ty == Tsarray)
{
unsafeAssign(sc, fdc, par, arg, gag, result, v, "variadic variable");
}
}
else
{
/* v is not 'scope', and is assigned to a parameter that may escape.
* Therefore, v can never be 'scope'.
*/
v->doNotInferScope = true;
}
}
for (size_t i = 0; i < er.byref.dim; i++)
{
VarDeclaration *v = er.byref[i];
if (v->isDataseg())
continue;
Dsymbol *p = v->toParent2();
v->storage_class &= ~STCmaybescope;
if ((v->storage_class & (STCref | STCout)) == 0 && p == sc->func)
{
unsafeAssign(sc, fdc, par, arg, gag, result, v, "reference to local variable");
continue;
}
}
for (size_t i = 0; i < er.byfunc.dim; i++)
{
FuncDeclaration *fd = er.byfunc[i];
//printf("fd = %s, %d\n", fd->toChars(), fd->tookAddressOf);
VarDeclarations vars;
findAllOuterAccessedVariables(fd, &vars);
for (size_t j = 0; j < vars.dim; j++)
{
VarDeclaration *v = vars[j];
//printf("v = %s\n", v->toChars());
assert(!v->isDataseg()); // these are not put in the closureVars[]
Dsymbol *p = v->toParent2();
v->storage_class &= ~STCmaybescope;
if ((v->storage_class & (STCref | STCout | STCscope)) && p == sc->func)
{
unsafeAssign(sc, fdc, par, arg, gag, result, v, "reference to local");
continue;
//.........这里部分代码省略.........
示例9: checkReturnEscapeImpl
static bool checkReturnEscapeImpl(Scope *sc, Expression *e, bool refs, bool gag)
{
//printf("[%s] checkReturnEscapeImpl, e = %s\n", e->loc->toChars(), e->toChars());
EscapeByResults er;
if (refs)
escapeByRef(e, &er);
else
escapeByValue(e, &er);
if (!er.byref.dim && !er.byvalue.dim && !er.byexp.dim)
return false;
bool result = false;
for (size_t i = 0; i < er.byvalue.dim; i++)
{
VarDeclaration *v = er.byvalue[i];
//printf("byvalue %s\n", v->toChars());
if (v->isDataseg())
continue;
Dsymbol *p = v->toParent2();
if ((v->isScope() || (v->storage_class & STCmaybescope)) &&
!(v->storage_class & STCreturn) &&
v->isParameter() &&
sc->func->flags & FUNCFLAGreturnInprocess &&
p == sc->func)
{
inferReturn(sc->func, v); // infer addition of 'return'
continue;
}
if (v->isScope())
{
if (v->storage_class & STCreturn)
continue;
if (sc->_module && sc->_module->isRoot() &&
/* This case comes up when the ReturnStatement of a __foreachbody is
* checked for escapes by the caller of __foreachbody. Skip it.
*
* struct S { static int opApply(int delegate(S*) dg); }
* S* foo() {
* foreach (S* s; S) // create __foreachbody for body of foreach
* return s; // s is inferred as 'scope' but incorrectly tested in foo()
* return null; }
*/
!(!refs && p->parent == sc->func))
{
// Only look for errors if in module listed on command line
if (global.params.vsafe) // https://issues.dlang.org/show_bug.cgi?id=17029
{
if (!gag)
error(e->loc, "scope variable %s may not be returned", v->toChars());
result = true;
}
continue;
}
}
else if (v->storage_class & STCvariadic && p == sc->func)
{
Type *tb = v->type->toBasetype();
if (tb->ty == Tarray || tb->ty == Tsarray)
{
if (!gag)
error(e->loc, "returning `%s` escapes a reference to variadic parameter `%s`", e->toChars(), v->toChars());
result = false;
}
}
else
{
//printf("no infer for %s\n", v->toChars());
v->doNotInferScope = true;
}
}
for (size_t i = 0; i < er.byref.dim; i++)
{
VarDeclaration *v = er.byref[i];
//printf("byref %s\n", v->toChars());
if (v->isDataseg())
continue;
Dsymbol *p = v->toParent2();
if ((v->storage_class & (STCref | STCout)) == 0)
{
if (p == sc->func)
{
escapingRef(v, e, result, gag);
continue;
}
FuncDeclaration *fd = p->isFuncDeclaration();
if (fd && sc->func->flags & FUNCFLAGreturnInprocess)
{
/* Code like:
* int x;
* auto dg = () { return &x; }
* Making it:
//.........这里部分代码省略.........
示例10: checkAssignEscape
/****************************************
* Given an AssignExp, determine if the lvalue will cause
* the contents of the rvalue to escape.
* Print error messages when these are detected.
* Infer 'scope' for the lvalue where possible, in order
* to eliminate the error.
* Params:
* sc = used to determine current function and module
* ae = AssignExp to check for any pointers to the stack
* gag = do not print error messages
* Returns:
* true if pointers to the stack can escape via assignment
*/
bool checkAssignEscape(Scope *sc, Expression *e, bool gag)
{
//printf("checkAssignEscape(e: %s)\n", e->toChars());
if (e->op != TOKassign && e->op != TOKblit && e->op != TOKconstruct)
return false;
AssignExp *ae = (AssignExp *)e;
Expression *e1 = ae->e1;
Expression *e2 = ae->e2;
//printf("type = %s, %d\n", e1->type->toChars(), e1->type->hasPointers());
if (!e1->type->hasPointers())
return false;
if (e1->op == TOKslice)
return false;
EscapeByResults er;
escapeByValue(e2, &er);
if (!er.byref.dim && !er.byvalue.dim && !er.byfunc.dim && !er.byexp.dim)
return false;
VarDeclaration *va = NULL;
while (e1->op == TOKdotvar)
e1 = ((DotVarExp *)e1)->e1;
if (e1->op == TOKvar)
va = ((VarExp *)e1)->var->isVarDeclaration();
else if (e1->op == TOKthis)
va = ((ThisExp *)e1)->var->isVarDeclaration();
else if (e1->op == TOKindex)
{
IndexExp *ie = (IndexExp *)e1;
if (ie->e1->op == TOKvar && ie->e1->type->toBasetype()->ty == Tsarray)
va = ((VarExp *)ie->e1)->var->isVarDeclaration();
}
// Try to infer 'scope' for va if in a function not marked @system
bool inferScope = false;
if (va && sc->func && sc->func->type && sc->func->type->ty == Tfunction)
inferScope = ((TypeFunction *)sc->func->type)->trust != TRUSTsystem;
bool result = false;
for (size_t i = 0; i < er.byvalue.dim; i++)
{
VarDeclaration *v = er.byvalue[i];
//printf("byvalue: %s\n", v->toChars());
if (v->isDataseg())
continue;
Dsymbol *p = v->toParent2();
if (!(va && va->isScope()))
v->storage_class &= ~STCmaybescope;
if (v->isScope())
{
if (va && va->isScope() && va->storage_class & STCreturn && !(v->storage_class & STCreturn) &&
sc->func->setUnsafe())
{
if (!gag)
error(ae->loc, "scope variable %s assigned to return scope %s", v->toChars(), va->toChars());
result = true;
continue;
}
// If va's lifetime encloses v's, then error
if (va &&
((va->enclosesLifetimeOf(v) && !(v->storage_class & STCparameter)) ||
// va is class reference
(ae->e1->op == TOKdotvar && va->type->toBasetype()->ty == Tclass && (va->enclosesLifetimeOf(v) || !va->isScope())) ||
va->storage_class & STCref) &&
sc->func->setUnsafe())
{
if (!gag)
error(ae->loc, "scope variable %s assigned to %s with longer lifetime", v->toChars(), va->toChars());
result = true;
continue;
}
if (va && !va->isDataseg() && !va->doNotInferScope)
{
if (!va->isScope() && inferScope)
{ //printf("inferring scope for %s\n", va->toChars());
va->storage_class |= STCscope | STCscopeinferred;
va->storage_class |= v->storage_class & STCreturn;
//.........这里部分代码省略.........
示例11: semantic
//.........这里部分代码省略.........
global.gag = 0;
s->semantic(sc2);
global.gag = oldgag;
}
if (sizeok == 2)
{ // semantic() failed because of forward references.
// Unwind what we did, and defer it for later
fields.setDim(0);
structsize = 0;
alignsize = 0;
structalign = 0;
scope = scx ? scx : new Scope(*sc);
scope->setNoFree();
scope->module->addDeferredSemantic(this);
Module::dprogress = dprogress_save;
//printf("\tdeferring %s\n", toChars());
return;
}
finalizeSize();
Module::dprogress++;
//printf("-StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
// Determine if struct is all zeros or not
zeroInit = 1;
for (size_t i = 0; i < fields.dim; i++)
{
Dsymbol *s = fields.tdata()[i];
VarDeclaration *vd = s->isVarDeclaration();
if (vd && !vd->isDataseg())
{
if (vd->init)
{
// Should examine init to see if it is really all 0's
zeroInit = 0;
break;
}
else
{
if (!vd->type->isZeroInit(loc))
{
zeroInit = 0;
break;
}
}
}
}
#if DMDV1
/* This doesn't work for DMDV2 because (ref S) and (S) parameter
* lists will overload the same.
*/
/* The TypeInfo_Struct is expecting an opEquals and opCmp with
* a parameter that is a pointer to the struct. But if there
* isn't one, but is an opEquals or opCmp with a value, write
* another that is a shell around the value:
* int opCmp(struct *p) { return opCmp(*p); }
*/
TypeFunction *tfeqptr;
{
Parameters *arguments = new Parameters;
示例12: semantic
//.........这里部分代码省略.........
if (sizeok == SIZEOKfwd)
{
// semantic() failed because of forward references.
// Unwind what we did, and defer it for later
for (size_t i = 0; i < fields.dim; i++)
{
VarDeclaration *vd = fields[i];
vd->offset = 0;
}
fields.setDim(0);
structsize = 0;
alignsize = 0;
scope = scx ? scx : sc->copy();
scope->setNoFree();
scope->module->addDeferredSemantic(this);
Module::dprogress = dprogress_save;
//printf("\tdeferring %s\n", toChars());
return;
}
Module::dprogress++;
semanticRun = PASSsemanticdone;
//printf("-StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
// Determine if struct is all zeros or not
zeroInit = 1;
for (size_t i = 0; i < fields.dim; i++)
{
VarDeclaration *vd = fields[i];
if (!vd->isDataseg())
{
if (vd->init)
{
// Should examine init to see if it is really all 0's
zeroInit = 0;
break;
}
else
{
if (!vd->type->isZeroInit(loc))
{
zeroInit = 0;
break;
}
}
}
}
dtor = buildDtor(this, sc2);
postblit = buildPostBlit(this, sc2);
cpctor = buildCpCtor(this, sc2);
buildOpAssign(this, sc2);
buildOpEquals(this, sc2);
xeq = buildXopEquals(this, sc2);
xcmp = buildXopCmp(this, sc2);
xhash = buildXtoHash(this, sc2);
/* Even if the struct is merely imported and its semantic3 is not run,
* the TypeInfo object would be speculatively stored in each object
* files. To set correct function pointer, run semantic3 for xeq and xcmp.
示例13: semantic
//.........这里部分代码省略.........
if (sizeok == SIZEOKfwd)
{ // semantic() failed because of forward references.
// Unwind what we did, and defer it for later
for (size_t i = 0; i < fields.dim; i++)
{ Dsymbol *s = fields[i];
VarDeclaration *vd = s->isVarDeclaration();
if (vd)
vd->offset = 0;
}
fields.setDim(0);
structsize = 0;
alignsize = 0;
// structalign = 0;
scope = scx ? scx : new Scope(*sc);
scope->setNoFree();
scope->module->addDeferredSemantic(this);
Module::dprogress = dprogress_save;
//printf("\tdeferring %s\n", toChars());
return;
}
Module::dprogress++;
//printf("-StructDeclaration::semantic(this=%p, '%s')\n", this, toChars());
// Determine if struct is all zeros or not
zeroInit = 1;
for (size_t i = 0; i < fields.dim; i++)
{
Dsymbol *s = fields[i];
VarDeclaration *vd = s->isVarDeclaration();
if (vd && !vd->isDataseg())
{
if (vd->init)
{
// Should examine init to see if it is really all 0's
zeroInit = 0;
break;
}
else
{
if (!vd->type->isZeroInit(loc))
{
zeroInit = 0;
break;
}
}
}
}
#if DMDV1
/* This doesn't work for DMDV2 because (ref S) and (S) parameter
* lists will overload the same.
*/
/* The TypeInfo_Struct is expecting an opEquals and opCmp with
* a parameter that is a pointer to the struct. But if there
* isn't one, but is an opEquals or opCmp with a value, write
* another that is a shell around the value:
* int opCmp(struct *p) { return opCmp(*p); }
*/
TypeFunction *tfeqptr;
{
Parameters *arguments = new Parameters;
示例14: finalizeSize
void StructDeclaration::finalizeSize(Scope *sc)
{
//printf("StructDeclaration::finalizeSize() %s\n", toChars());
if (sizeok != SIZEOKnone)
return;
// Set the offsets of the fields and determine the size of the struct
unsigned offset = 0;
bool isunion = isUnionDeclaration() != NULL;
for (size_t i = 0; i < members->dim; i++)
{
Dsymbol *s = (*members)[i];
s->setFieldOffset(this, &offset, isunion);
}
if (sizeok == SIZEOKfwd)
return;
// 0 sized struct's are set to 1 byte
if (structsize == 0)
{
structsize = 1;
alignsize = 1;
}
// Round struct size up to next alignsize boundary.
// This will ensure that arrays of structs will get their internals
// aligned properly.
if (alignment == STRUCTALIGN_DEFAULT)
structsize = (structsize + alignsize - 1) & ~(alignsize - 1);
else
structsize = (structsize + alignment - 1) & ~(alignment - 1);
sizeok = SIZEOKdone;
// Calculate fields[i]->overlapped
fill(loc, NULL, true);
// Determine if struct is all zeros or not
zeroInit = 1;
for (size_t i = 0; i < fields.dim; i++)
{
VarDeclaration *vd = fields[i];
if (!vd->isDataseg())
{
if (vd->init)
{
// Should examine init to see if it is really all 0's
zeroInit = 0;
break;
}
else
{
if (!vd->type->isZeroInit(loc))
{
zeroInit = 0;
break;
}
}
}
}
// Look for the constructor, for the struct literal/constructor call expression
ctor = searchCtor();
if (ctor)
{
// Finish all constructors semantics to determine this->noDefaultCtor.
struct SearchCtor
{
static int fp(Dsymbol *s, void *ctxt)
{
CtorDeclaration *f = s->isCtorDeclaration();
if (f && f->semanticRun == PASSinit)
f->semantic(NULL);
return 0;
}
};
for (size_t i = 0; i < members->dim; i++)
{
Dsymbol *s = (*members)[i];
s->apply(&SearchCtor::fp, NULL);
}
}
}