Commit f4b6fc8c by Iain Buclaw

Merge dmd upstream 5220ad51e

Backports Ddoc fix that is present in upstream, but did not make its way
into the C++ port of the D front-end implementation.

The old special types for C long, unsigned long, and long double have
also been removed as neither the compiler nor druntime bindings support
handling it anymore.

Commits merged from dmd.

	Backport Issue 14633: Fixed false DDoc warnings
	https://github.com/dlang/dmd/pull/9027

	Remove old support code for struct __c_long/ulong/long_double
	https://github.com/dlang/dmd/pull/9028

From-SVN: r266719
parent bb567ea3
6243fa6d2ceab4615a9fe21c5bc9484e52bb2d1e 5220ad51eebe06754e6881d9bd5aab89dba2b065
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/dmd repository. merge done from the dlang/dmd repository.
...@@ -952,15 +952,6 @@ public: ...@@ -952,15 +952,6 @@ public:
if (t->isImmutable() || t->isShared()) if (t->isImmutable() || t->isShared())
return error(t); 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()); //printf("TypeStruct %s\n", t->toChars());
doSymbol(t); doSymbol(t);
} }
......
...@@ -133,6 +133,25 @@ bool isCVariadicParameter(Dsymbols *a, const utf8_t *p, size_t len) ...@@ -133,6 +133,25 @@ bool isCVariadicParameter(Dsymbols *a, const utf8_t *p, size_t len)
return false; 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) static Dsymbol *getEponymousMember(TemplateDeclaration *td)
{ {
if (!td->onemember) if (!td->onemember)
...@@ -150,6 +169,54 @@ static Dsymbol *getEponymousMember(TemplateDeclaration *td) ...@@ -150,6 +169,54 @@ static Dsymbol *getEponymousMember(TemplateDeclaration *td)
return NULL; 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) static TemplateDeclaration *getEponymousParent(Dsymbol *s)
{ {
if (!s->parent) if (!s->parent)
...@@ -1590,6 +1657,12 @@ void ParamSection::write(Loc loc, DocComment *, Scope *sc, Dsymbols *a, OutBuffe ...@@ -1590,6 +1657,12 @@ void ParamSection::write(Loc loc, DocComment *, Scope *sc, Dsymbols *a, OutBuffe
{ {
size_t o = buf->offset; size_t o = buf->offset;
Parameter *fparam = isFunctionParameter(a, namestart, namelen); 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); bool isCVariadic = isCVariadicParameter(a, namestart, namelen);
if (isCVariadic) if (isCVariadic)
{ {
...@@ -2085,17 +2158,10 @@ Parameter *isFunctionParameter(Dsymbols *a, const utf8_t *p, size_t len) ...@@ -2085,17 +2158,10 @@ Parameter *isFunctionParameter(Dsymbols *a, const utf8_t *p, size_t len)
{ {
for (size_t i = 0; i < a->dim; i++) for (size_t i = 0; i < a->dim; i++)
{ {
TypeFunction *tf = isTypeFunction((*a)[i]); Parameter *fparam = isFunctionParameter((*a)[i], p, len);
if (tf && tf->parameters) if (fparam)
{ {
for (size_t k = 0; k < tf->parameters->dim; k++) return fparam;
{
Parameter *fparam = (*tf->parameters)[k];
if (fparam->ident && cmp(fparam->ident->toChars(), p, len) == 0)
{
return fparam;
}
}
} }
} }
return NULL; return NULL;
...@@ -2108,7 +2174,10 @@ TemplateParameter *isTemplateParameter(Dsymbols *a, const utf8_t *p, size_t len) ...@@ -2108,7 +2174,10 @@ TemplateParameter *isTemplateParameter(Dsymbols *a, const utf8_t *p, size_t len)
{ {
for (size_t i = 0; i < a->dim; i++) 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) if (td && td->origParameters)
{ {
for (size_t k = 0; k < td->origParameters->dim; k++) for (size_t k = 0; k < td->origParameters->dim; k++)
......
// PERMUTE_ARGS: // PERMUTE_ARGS:
// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- // REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o-
/* /*
TEST_OUTPUT: TEST_OUTPUT:
......
// PERMUTE_ARGS: // PERMUTE_ARGS:
// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- // REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o-
/* /*
TEST_OUTPUT: TEST_OUTPUT:
......
// PERMUTE_ARGS: // PERMUTE_ARGS:
// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- // REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o-
/* /*
TEST_OUTPUT: TEST_OUTPUT:
--- ---
......
// PERMUTE_ARGS: // PERMUTE_ARGS:
// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- // REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o-
/* /*
TEST_OUTPUT: TEST_OUTPUT:
......
...@@ -612,13 +612,7 @@ extern(C++) ...@@ -612,13 +612,7 @@ extern(C++)
version (CRuntime_Microsoft) version (CRuntime_Microsoft)
{ {
struct __c_long_double enum __c_long_double : double;
{
this(double d) { ld = d; }
double ld;
alias ld this;
}
alias __c_long_double myld; alias __c_long_double myld;
} }
else else
...@@ -655,20 +649,8 @@ else ...@@ -655,20 +649,8 @@ else
} }
} }
struct __c_long enum __c_long : x_long;
{ enum __c_ulong : x_ulong;
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;
}
alias __c_long mylong; alias __c_long mylong;
alias __c_ulong myulong; alias __c_ulong myulong;
...@@ -688,6 +670,43 @@ void test16() ...@@ -688,6 +670,43 @@ void test16()
ld = testul(ld); ld = testul(ld);
assert(ld == 5 + myulong.sizeof); 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);
} }
/****************************************/ /****************************************/
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment