aboutsummaryrefslogtreecommitdiff
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
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
-rw-r--r--gcc/d/dmd/MERGE2
-rw-r--r--gcc/d/dmd/cppmangle.c9
-rw-r--r--gcc/d/dmd/doc.c91
-rw-r--r--gcc/testsuite/gdc.test/compilable/ddoc10236.d2
-rw-r--r--gcc/testsuite/gdc.test/compilable/ddoc10236b.d2
-rw-r--r--gcc/testsuite/gdc.test/compilable/ddoc13502.d2
-rw-r--r--gcc/testsuite/gdc.test/compilable/ddoc4899.d2
-rw-r--r--gcc/testsuite/gdc.test/runnable/cppa.d61
8 files changed, 125 insertions, 46 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++)
diff --git a/gcc/testsuite/gdc.test/compilable/ddoc10236.d b/gcc/testsuite/gdc.test/compilable/ddoc10236.d
index 25738ec..1c54761 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 d814d37..065ced0 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 6ab2ca0..93f383f 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 1fbd6a9..b5cfa86 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 3b28342..82b93ad 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);
}
/****************************************/