diff options
author | Iain Buclaw <ibuclaw@gcc.gnu.org> | 2018-12-02 11:47:49 +0000 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gcc.gnu.org> | 2018-12-02 11:47:49 +0000 |
commit | f4b6fc8c53afad76c98e9d8c7debfd092c4d9620 (patch) | |
tree | a62e9c7a765575db1f43be17ddd0cc84a20392e5 /gcc/d | |
parent | bb567ea30776994f691557d7f3cd80e332d68295 (diff) | |
download | gcc-f4b6fc8c53afad76c98e9d8c7debfd092c4d9620.zip gcc-f4b6fc8c53afad76c98e9d8c7debfd092c4d9620.tar.gz gcc-f4b6fc8c53afad76c98e9d8c7debfd092c4d9620.tar.bz2 |
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
Diffstat (limited to 'gcc/d')
-rw-r--r-- | gcc/d/dmd/MERGE | 2 | ||||
-rw-r--r-- | gcc/d/dmd/cppmangle.c | 9 | ||||
-rw-r--r-- | gcc/d/dmd/doc.c | 91 |
3 files changed, 81 insertions, 21 deletions
diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index 7727205..223ffbd 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 d2d3576..ad88242d 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 d35ca7b..797991e 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++) |