if (t->isImmutable() || t->isShared())
return error(t);
- /* __c_long and __c_ulong get special mangling
- */
- Identifier *id = t->sym->ident;
- //printf("struct id = '%s'\n", id->toChars());
- if (id == Id::__c_long)
- return writeBasicType(t, 0, 'l');
- else if (id == Id::__c_ulong)
- return writeBasicType(t, 0, 'm');
-
//printf("TypeStruct %s\n", t->toChars());
doSymbol(t);
}
return false;
}
+/****************************************************
+ */
+static Parameter *isFunctionParameter(Dsymbol *s, const utf8_t *p, size_t len)
+{
+ TypeFunction *tf = isTypeFunction(s);
+ if (tf && tf->parameters)
+ {
+ for (size_t k = 0; k < tf->parameters->dim; k++)
+ {
+ Parameter *fparam = (*tf->parameters)[k];
+ if (fparam->ident && cmp(fparam->ident->toChars(), p, len) == 0)
+ {
+ return fparam;
+ }
+ }
+ }
+ return NULL;
+}
+
static Dsymbol *getEponymousMember(TemplateDeclaration *td)
{
if (!td->onemember)
return NULL;
}
+/****************************************************
+ */
+static Parameter *isEponymousFunctionParameter(Dsymbols *a, const utf8_t *p, size_t len)
+{
+ for (size_t i = 0; i < a->dim; i++)
+ {
+ TemplateDeclaration *td = (*a)[i]->isTemplateDeclaration();
+ if (td && td->onemember)
+ {
+ /* Case 1: we refer to a template declaration inside the template
+
+ /// ...ddoc...
+ template case1(T) {
+ void case1(R)() {}
+ }
+ */
+ td = td->onemember->isTemplateDeclaration();
+ }
+ if (!td)
+ {
+ /* Case 2: we're an alias to a template declaration
+
+ /// ...ddoc...
+ alias case2 = case1!int;
+ */
+ AliasDeclaration *ad = (*a)[i]->isAliasDeclaration();
+ if (ad && ad->aliassym)
+ {
+ td = ad->aliassym->isTemplateDeclaration();
+ }
+ }
+ while (td)
+ {
+ Dsymbol *sym = getEponymousMember(td);
+ if (sym)
+ {
+ Parameter *fparam = isFunctionParameter(sym, p, len);
+ if (fparam)
+ {
+ return fparam;
+ }
+ }
+ td = td->overnext;
+ }
+ }
+ return NULL;
+}
+
static TemplateDeclaration *getEponymousParent(Dsymbol *s)
{
if (!s->parent)
{
size_t o = buf->offset;
Parameter *fparam = isFunctionParameter(a, namestart, namelen);
+ if (!fparam)
+ {
+ // Comments on a template might refer to function parameters within.
+ // Search the parameters of nested eponymous functions (with the same name.)
+ fparam = isEponymousFunctionParameter(a, namestart, namelen);
+ }
bool isCVariadic = isCVariadicParameter(a, namestart, namelen);
if (isCVariadic)
{
{
for (size_t i = 0; i < a->dim; i++)
{
- TypeFunction *tf = isTypeFunction((*a)[i]);
- if (tf && tf->parameters)
+ Parameter *fparam = isFunctionParameter((*a)[i], p, len);
+ if (fparam)
{
- for (size_t k = 0; k < tf->parameters->dim; k++)
- {
- Parameter *fparam = (*tf->parameters)[k];
- if (fparam->ident && cmp(fparam->ident->toChars(), p, len) == 0)
- {
- return fparam;
- }
- }
+ return fparam;
}
}
return NULL;
{
for (size_t i = 0; i < a->dim; i++)
{
- TemplateDeclaration *td = getEponymousParent((*a)[i]);
+ TemplateDeclaration *td = (*a)[i]->isTemplateDeclaration();
+ // Check for the parent, if the current symbol is not a template declaration.
+ if (!td)
+ td = getEponymousParent((*a)[i]);
if (td && td->origParameters)
{
for (size_t k = 0; k < td->origParameters->dim; k++)
version (CRuntime_Microsoft)
{
- struct __c_long_double
- {
- this(double d) { ld = d; }
- double ld;
- alias ld this;
- }
-
+ enum __c_long_double : double;
alias __c_long_double myld;
}
else
}
}
-struct __c_long
-{
- this(x_long d) { ld = d; }
- x_long ld;
- alias ld this;
-}
-
-struct __c_ulong
-{
- this(x_ulong d) { ld = d; }
- x_ulong ld;
- alias ld this;
-}
-
+enum __c_long : x_long;
+enum __c_ulong : x_ulong;
alias __c_long mylong;
alias __c_ulong myulong;
ld = testul(ld);
assert(ld == 5 + myulong.sizeof);
}
+
+ static if (__c_long.sizeof == long.sizeof)
+ {
+ static assert(__c_long.max == long.max);
+ static assert(__c_long.min == long.min);
+ static assert(__c_long.init == long.init);
+ static assert(__c_ulong.max == ulong.max);
+ static assert(__c_ulong.min == ulong.min);
+ static assert(__c_ulong.init == ulong.init);
+ __c_long cl = 0;
+ cl = cl + 1;
+ long l = cl;
+ cl = l;
+ __c_ulong cul = 0;
+ cul = cul + 1;
+ ulong ul = cul;
+ cul = ul;
+ }
+ else static if (__c_long.sizeof == int.sizeof)
+ {
+ static assert(__c_long.max == int.max);
+ static assert(__c_long.min == int.min);
+ static assert(__c_long.init == int.init);
+ static assert(__c_ulong.max == uint.max);
+ static assert(__c_ulong.min == uint.min);
+ static assert(__c_ulong.init == uint.init);
+ __c_long cl = 0;
+ cl = cl + 1;
+ int i = cl;
+ cl = i;
+ __c_ulong cul = 0;
+ cul = cul + 1;
+ uint u = cul;
+ cul = u;
+ }
+ else
+ static assert(0);
}
/****************************************/