aboutsummaryrefslogtreecommitdiff
path: root/gcc/d
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gcc.gnu.org>2018-12-02 11:47:49 +0000
committerIain Buclaw <ibuclaw@gcc.gnu.org>2018-12-02 11:47:49 +0000
commitf4b6fc8c53afad76c98e9d8c7debfd092c4d9620 (patch)
treea62e9c7a765575db1f43be17ddd0cc84a20392e5 /gcc/d
parentbb567ea30776994f691557d7f3cd80e332d68295 (diff)
downloadgcc-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/MERGE2
-rw-r--r--gcc/d/dmd/cppmangle.c9
-rw-r--r--gcc/d/dmd/doc.c91
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++)