Skip to content

Commit

Permalink
Merge pull request #2617 from 9rnsr/fix4018
Browse files Browse the repository at this point in the history
Issue 4018 - __FILE__ and __LINE__ as default template parameters not set to instantiation point per spec
  • Loading branch information
AndrejMitrovic committed Oct 3, 2013
2 parents 1d91f0a + 7c4ef33 commit 6c8f9ff
Show file tree
Hide file tree
Showing 7 changed files with 238 additions and 202 deletions.
2 changes: 1 addition & 1 deletion src/expression.c
Original file line number Diff line number Diff line change
Expand Up @@ -6792,7 +6792,7 @@ Expression *IsExp::semantic(Scope *sc)
{ TemplateParameter *tp = (*parameters)[i];
Declaration *s = NULL;

m = tp->matchArg(sc, &tiargs, i, parameters, &dedtypes, &s);
m = tp->matchArg(loc, sc, &tiargs, i, parameters, &dedtypes, &s);
if (m == MATCHnomatch)
goto Lno;
s->semantic(sc);
Expand Down
145 changes: 46 additions & 99 deletions src/template.c
Original file line number Diff line number Diff line change
Expand Up @@ -844,12 +844,14 @@ MATCH TemplateDeclaration::matchWithInstance(Scope *sc, TemplateInstance *ti,
Scope *paramscope = scope->push(paramsym);
Module *mi = ti->instantiatingModule ? ti->instantiatingModule : sc->instantiatingModule;
paramscope->instantiatingModule = mi;
paramscope->callsc = sc;
paramscope->stc = 0;

// Attempt type deduction
m = MATCHexact;
for (size_t i = 0; i < dedtypes_dim; i++)
{ MATCH m2;
{
MATCH m2;
TemplateParameter *tp = (*parameters)[i];
Declaration *sparam;

Expand All @@ -861,7 +863,7 @@ MATCH TemplateDeclaration::matchWithInstance(Scope *sc, TemplateInstance *ti,
printf("\tparameter[%d] is %s : %s\n", i, tp->ident->toChars(), ttp->specType ? ttp->specType->toChars() : "");
#endif

m2 = tp->matchArg(paramscope, ti->tiargs, i, parameters, dedtypes, &sparam);
m2 = tp->matchArg(ti->loc, paramscope, ti->tiargs, i, parameters, dedtypes, &sparam);
//printf("\tm2 = %d\n", m2);

if (m2 == MATCHnomatch)
Expand Down Expand Up @@ -1218,7 +1220,7 @@ MATCH TemplateDeclaration::deduceFunctionTemplateMatch(FuncDeclaration *f, Loc l
MATCH m;
Declaration *sparam = NULL;

m = tp->matchArg(paramscope, dedargs, i, parameters, &dedtypes, &sparam);
m = tp->matchArg(loc, paramscope, dedargs, i, parameters, &dedtypes, &sparam);
//printf("\tdeduceType m = %d\n", m);
if (m == MATCHnomatch)
goto Lnomatch;
Expand Down Expand Up @@ -1950,7 +1952,7 @@ MATCH TemplateDeclaration::deduceFunctionTemplateMatch(FuncDeclaration *f, Loc l
* the oded == oarg
*/
(*dedargs)[i] = oded;
MATCH m2 = tparam->matchArg(paramscope, dedargs, i, parameters, &dedtypes, NULL);
MATCH m2 = tparam->matchArg(loc, paramscope, dedargs, i, parameters, &dedtypes, NULL);
//printf("m2 = %d\n", m2);
if (!m2)
goto Lnomatch;
Expand Down Expand Up @@ -4113,6 +4115,45 @@ TemplateThisParameter *TemplateParameter::isTemplateThisParameter()
}
#endif

/*******************************************
* Match to a particular TemplateParameter.
* Input:
* i i'th argument
* tiargs[] actual arguments to template instance
* parameters[] template parameters
* dedtypes[] deduced arguments to template instance
* *psparam set to symbol declared and initialized to dedtypes[i]
*/

MATCH TemplateParameter::matchArg(Loc loc, Scope *sc, Objects *tiargs,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
{
RootObject *oarg;

if (i < tiargs->dim)
oarg = (*tiargs)[i];
else
{
// Get default argument instead
oarg = defaultArg(loc, sc);
if (!oarg)
{
assert(i < dedtypes->dim);
// It might have already been deduced
oarg = (*dedtypes)[i];
if (!oarg)
goto Lnomatch;
}
}
return matchArg(sc, oarg, i, parameters, dedtypes, psparam);

Lnomatch:
if (psparam)
*psparam = NULL;
return MATCHnomatch;
}

/* ======================== TemplateTypeParameter =========================== */

// type-parameter
Expand Down Expand Up @@ -4194,45 +4235,6 @@ int TemplateTypeParameter::overloadMatch(TemplateParameter *tp)
return 0;
}

/*******************************************
* Match to a particular TemplateParameter.
* Input:
* i i'th argument
* tiargs[] actual arguments to template instance
* parameters[] template parameters
* dedtypes[] deduced arguments to template instance
* *psparam set to symbol declared and initialized to dedtypes[i]
*/

MATCH TemplateTypeParameter::matchArg(Scope *sc, Objects *tiargs,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
{
RootObject *oarg;

if (i < tiargs->dim)
oarg = (*tiargs)[i];
else
{ // Get default argument instead
oarg = defaultArg(loc, sc);
if (!oarg)
{ assert(i < dedtypes->dim);
// It might have already been deduced
oarg = (*dedtypes)[i];
if (!oarg)
{
goto Lnomatch;
}
}
}
return matchArg(sc, oarg, i, parameters, dedtypes, psparam);

Lnomatch:
if (psparam)
*psparam = NULL;
return MATCHnomatch;
}

MATCH TemplateTypeParameter::matchArg(Scope *sc, RootObject *oarg,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
Expand Down Expand Up @@ -4529,33 +4531,6 @@ bool isPseudoDsymbol(RootObject *o)
return false;
}

MATCH TemplateAliasParameter::matchArg(Scope *sc, Objects *tiargs,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
{
RootObject *oarg;

if (i < tiargs->dim)
oarg = (*tiargs)[i];
else
{ // Get default argument instead
oarg = defaultArg(loc, sc);
if (!oarg)
{ assert(i < dedtypes->dim);
// It might have already been deduced
oarg = (*dedtypes)[i];
if (!oarg)
goto Lnomatch;
}
}
return matchArg(sc, oarg, i, parameters, dedtypes, psparam);

Lnomatch:
if (psparam)
*psparam = NULL;
return MATCHnomatch;
}

MATCH TemplateAliasParameter::matchArg(Scope *sc, RootObject *oarg,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
Expand Down Expand Up @@ -4830,34 +4805,6 @@ int TemplateValueParameter::overloadMatch(TemplateParameter *tp)
return 0;
}


MATCH TemplateValueParameter::matchArg(Scope *sc, Objects *tiargs,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
{
RootObject *oarg;

if (i < tiargs->dim)
oarg = (*tiargs)[i];
else
{ // Get default argument instead
oarg = defaultArg(loc, sc);
if (!oarg)
{ assert(i < dedtypes->dim);
// It might have already been deduced
oarg = (*dedtypes)[i];
if (!oarg)
goto Lnomatch;
}
}
return matchArg(sc, oarg, i, parameters, dedtypes, psparam);

Lnomatch:
if (psparam)
*psparam = NULL;
return MATCHnomatch;
}

MATCH TemplateValueParameter::matchArg(Scope *sc, RootObject *oarg,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
Expand Down Expand Up @@ -5077,7 +5024,7 @@ int TemplateTupleParameter::overloadMatch(TemplateParameter *tp)
return 0;
}

MATCH TemplateTupleParameter::matchArg(Scope *sc, Objects *tiargs,
MATCH TemplateTupleParameter::matchArg(Loc loc, Scope *sc, Objects *tiargs,
size_t i, TemplateParameters *parameters, Objects *dedtypes,
Declaration **psparam)
{
Expand Down
7 changes: 2 additions & 5 deletions src/template.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class TemplateParameter

/* Match actual argument against parameter.
*/
virtual MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam) = 0;
virtual MATCH matchArg(Loc loc, Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
virtual MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam) = 0;

/* Create dummy argument based on parameter.
Expand Down Expand Up @@ -187,7 +187,6 @@ class TemplateTypeParameter : public TemplateParameter
RootObject *specialization();
RootObject *defaultArg(Loc loc, Scope *sc);
int overloadMatch(TemplateParameter *);
MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
void *dummyArg();
};
Expand Down Expand Up @@ -232,7 +231,6 @@ class TemplateValueParameter : public TemplateParameter
RootObject *specialization();
RootObject *defaultArg(Loc loc, Scope *sc);
int overloadMatch(TemplateParameter *);
MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
void *dummyArg();
};
Expand Down Expand Up @@ -261,7 +259,6 @@ class TemplateAliasParameter : public TemplateParameter
RootObject *specialization();
RootObject *defaultArg(Loc loc, Scope *sc);
int overloadMatch(TemplateParameter *);
MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
void *dummyArg();
};
Expand All @@ -284,7 +281,7 @@ class TemplateTupleParameter : public TemplateParameter
RootObject *specialization();
RootObject *defaultArg(Loc loc, Scope *sc);
int overloadMatch(TemplateParameter *);
MATCH matchArg(Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
MATCH matchArg(Loc loc, Scope *sc, Objects *tiargs, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
MATCH matchArg(Scope *sc, RootObject *oarg, size_t i, TemplateParameters *parameters, Objects *dedtypes, Declaration **psparam);
void *dummyArg();
};
Expand Down
84 changes: 0 additions & 84 deletions test/runnable/Fix5140.d

This file was deleted.

13 changes: 0 additions & 13 deletions test/runnable/imports/Fix5140a_file.d

This file was deleted.

Loading

0 comments on commit 6c8f9ff

Please sign in to comment.