From f4b6fc8c53afad76c98e9d8c7debfd092c4d9620 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Sun, 2 Dec 2018 11:47:49 +0000 Subject: [PATCH] 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 --- gcc/d/dmd/MERGE | 2 +- gcc/d/dmd/cppmangle.c | 9 -- gcc/d/dmd/doc.c | 91 ++++++++++++++++--- gcc/testsuite/gdc.test/compilable/ddoc10236.d | 2 +- .../gdc.test/compilable/ddoc10236b.d | 2 +- gcc/testsuite/gdc.test/compilable/ddoc13502.d | 2 +- gcc/testsuite/gdc.test/compilable/ddoc4899.d | 2 +- gcc/testsuite/gdc.test/runnable/cppa.d | 61 ++++++++----- 8 files changed, 125 insertions(+), 46 deletions(-) diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index 7727205bed4..223ffbdc358 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -6243fa6d2ceab4615a9fe21c5bc9484e52bb2d1e +5220ad51eebe06754e6881d9bd5aab89dba2b065 The first line of this file holds the git revision number of the last merge done from the dlang/dmd repository. diff --git a/gcc/d/dmd/cppmangle.c b/gcc/d/dmd/cppmangle.c index d2d357667cb..ad88242d820 100644 --- a/gcc/d/dmd/cppmangle.c +++ b/gcc/d/dmd/cppmangle.c @@ -952,15 +952,6 @@ public: 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); } diff --git a/gcc/d/dmd/doc.c b/gcc/d/dmd/doc.c index d35ca7b2522..797991ee2c4 100644 --- a/gcc/d/dmd/doc.c +++ b/gcc/d/dmd/doc.c @@ -133,6 +133,25 @@ bool isCVariadicParameter(Dsymbols *a, const utf8_t *p, size_t len) 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) @@ -150,6 +169,54 @@ static Dsymbol *getEponymousMember(TemplateDeclaration *td) 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) @@ -1590,6 +1657,12 @@ void ParamSection::write(Loc loc, DocComment *, Scope *sc, Dsymbols *a, OutBuffe { 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) { @@ -2085,17 +2158,10 @@ Parameter *isFunctionParameter(Dsymbols *a, const utf8_t *p, size_t len) { 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; @@ -2108,7 +2174,10 @@ TemplateParameter *isTemplateParameter(Dsymbols *a, const utf8_t *p, size_t len) { 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++) diff --git a/gcc/testsuite/gdc.test/compilable/ddoc10236.d b/gcc/testsuite/gdc.test/compilable/ddoc10236.d index 25738ec34e3..1c547613c44 100644 --- a/gcc/testsuite/gdc.test/compilable/ddoc10236.d +++ b/gcc/testsuite/gdc.test/compilable/ddoc10236.d @@ -1,5 +1,5 @@ // PERMUTE_ARGS: -// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- +// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o- /* TEST_OUTPUT: diff --git a/gcc/testsuite/gdc.test/compilable/ddoc10236b.d b/gcc/testsuite/gdc.test/compilable/ddoc10236b.d index d814d375c06..065ced0936c 100644 --- a/gcc/testsuite/gdc.test/compilable/ddoc10236b.d +++ b/gcc/testsuite/gdc.test/compilable/ddoc10236b.d @@ -1,5 +1,5 @@ // PERMUTE_ARGS: -// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- +// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o- /* TEST_OUTPUT: diff --git a/gcc/testsuite/gdc.test/compilable/ddoc13502.d b/gcc/testsuite/gdc.test/compilable/ddoc13502.d index 6ab2ca0614d..93f383fea9f 100644 --- a/gcc/testsuite/gdc.test/compilable/ddoc13502.d +++ b/gcc/testsuite/gdc.test/compilable/ddoc13502.d @@ -1,5 +1,5 @@ // PERMUTE_ARGS: -// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- +// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o- /* TEST_OUTPUT: --- diff --git a/gcc/testsuite/gdc.test/compilable/ddoc4899.d b/gcc/testsuite/gdc.test/compilable/ddoc4899.d index 1fbd6a9cbe8..b5cfa86367c 100644 --- a/gcc/testsuite/gdc.test/compilable/ddoc4899.d +++ b/gcc/testsuite/gdc.test/compilable/ddoc4899.d @@ -1,5 +1,5 @@ // PERMUTE_ARGS: -// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -w -o- +// REQUIRED_ARGS: -D -Dd${RESULTS_DIR}/compilable -wi -o- /* TEST_OUTPUT: diff --git a/gcc/testsuite/gdc.test/runnable/cppa.d b/gcc/testsuite/gdc.test/runnable/cppa.d index 3b283427951..82b93adf1f6 100644 --- a/gcc/testsuite/gdc.test/runnable/cppa.d +++ b/gcc/testsuite/gdc.test/runnable/cppa.d @@ -612,13 +612,7 @@ extern(C++) 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 @@ -655,20 +649,8 @@ 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; @@ -688,6 +670,43 @@ void test16() 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); } /****************************************/ -- 2.30.2