From be8ad18d4f86d26bef947fa83acaca4177786b6d Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Tue, 18 Sep 2018 23:31:44 +0200 Subject: [PATCH] Update to dmd master 20180918 --- gcc/d/ChangeLog | 6 + gcc/d/d-lang.cc | 6 +- gcc/d/decl.cc | 8 +- gcc/d/dmd/constfold.d | 2 - gcc/d/dmd/cppmangle.d | 4 +- gcc/d/dmd/dcast.d | 4 - gcc/d/dmd/declaration.d | 2 +- gcc/d/dmd/declaration.h | 2 +- gcc/d/dmd/dmangle.d | 7 +- gcc/d/dmd/dmodule.d | 18 ++- gcc/d/dmd/doc.d | 80 +++++------ gcc/d/dmd/dstruct.d | 132 +++++++++--------- gcc/d/dmd/dsymbol.d | 16 --- gcc/d/dmd/dsymbolsem.d | 6 +- gcc/d/dmd/dtemplate.d | 69 --------- gcc/d/dmd/expression.d | 13 -- gcc/d/dmd/expression.h | 1 - gcc/d/dmd/expressionsem.d | 22 --- gcc/d/dmd/gluelayer.d | 4 +- gcc/d/dmd/hdrgen.d | 5 - gcc/d/dmd/identifier.d | 30 ++-- gcc/d/dmd/identifier.h | 5 +- gcc/d/dmd/mars.h | 2 +- gcc/d/dmd/mtype.d | 3 +- gcc/d/dmd/opover.d | 3 - gcc/d/dmd/root/file.d | 19 ++- gcc/d/dmd/root/file.h | 5 +- gcc/d/dmd/root/filename.d | 21 +-- gcc/d/dmd/root/filename.h | 5 +- gcc/d/dmd/root/object.h | 2 - gcc/d/dmd/root/rootobject.d | 5 - gcc/d/dmd/semantic2.d | 9 -- gcc/d/dmd/statement.d | 10 -- gcc/d/dmd/statement.h | 1 - gcc/d/dmd/tokens.d | 8 -- gcc/d/dmd/tokens.h | 3 - gcc/d/dmd/traits.d | 32 ++++- gcc/d/dmd/typesem.d | 14 +- gcc/testsuite/gdc.test/compilable/cppmangle.d | 10 +- .../gdc.test/compilable/imports/test18771a.d | 3 + .../gdc.test/compilable/imports/test18771b.d | 3 + .../gdc.test/compilable/imports/test18771c.d | 4 + .../gdc.test/compilable/imports/test18771d.d | 4 + gcc/testsuite/gdc.test/compilable/test18771.d | 6 + .../gdc.test/runnable/cpp_abi_tests.d | 9 ++ .../runnable/extra-files/cpp_abi_tests.cpp | 8 ++ libphobos/libdruntime/core/thread.d | 87 ++++++------ 47 files changed, 318 insertions(+), 400 deletions(-) create mode 100644 gcc/testsuite/gdc.test/compilable/imports/test18771a.d create mode 100644 gcc/testsuite/gdc.test/compilable/imports/test18771b.d create mode 100644 gcc/testsuite/gdc.test/compilable/imports/test18771c.d create mode 100644 gcc/testsuite/gdc.test/compilable/imports/test18771d.d create mode 100644 gcc/testsuite/gdc.test/compilable/test18771.d diff --git a/gcc/d/ChangeLog b/gcc/d/ChangeLog index e820039bb..f110353c7 100644 --- a/gcc/d/ChangeLog +++ b/gcc/d/ChangeLog @@ -1,3 +1,9 @@ +2018-09-18 Iain Buclaw + + * d-lang.cc (deps_write): Use toChars accessor to get module path. + * decl.cc (get_symbol_decl): Use get_identifier_with_length to get + mangle override identifier node. + 2018-09-10 Iain Buclaw * d-lang.cc (d_init_options): Set-up global.params.argv0 as D array. diff --git a/gcc/d/d-lang.cc b/gcc/d/d-lang.cc index bd6a9133e..96aa198d8 100644 --- a/gcc/d/d-lang.cc +++ b/gcc/d/d-lang.cc @@ -175,7 +175,7 @@ deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72) } else { - str = module->objfile->name->str; + str = module->objfile->name.toChars (); size = strlen (str); } @@ -189,7 +189,7 @@ deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72) { Module *depmod = modlist.pop (); - str = depmod->srcfile->name->str; + str = depmod->srcfile->name.toChars (); size = strlen (str); /* Skip dependencies that have already been written. */ @@ -256,7 +256,7 @@ deps_write (Module *module, OutBuffer *buffer, unsigned colmax = 72) Module *m = phonylist[i]; buffer->writenl (); - buffer->writestring (m->srcfile->name->str); + buffer->writestring (m->srcfile->name.toChars ()); buffer->writestring (":\n"); } } diff --git a/gcc/d/decl.cc b/gcc/d/decl.cc index 05282d83f..ef2ca6589 100644 --- a/gcc/d/decl.cc +++ b/gcc/d/decl.cc @@ -1103,8 +1103,12 @@ get_symbol_decl (Declaration *decl) { tree mangled_name; - if (decl->mangleOverride) - mangled_name = get_identifier (decl->mangleOverride); + if (decl->mangleOverride.length) + { + mangled_name = + get_identifier_with_length (decl->mangleOverride.ptr, + decl->mangleOverride.length); + } else mangled_name = get_identifier (mangle_decl (decl)); diff --git a/gcc/d/dmd/constfold.d b/gcc/d/dmd/constfold.d index 2903610ec..dc8f81c11 100644 --- a/gcc/d/dmd/constfold.d +++ b/gcc/d/dmd/constfold.d @@ -389,8 +389,6 @@ UnionExp Div(const ref Loc loc, Type type, Expression e1, Expression e2) if (type.isfloating()) { auto c = complex_t(CTFloat.zero); - //e1.type.print(); - //e2.type.print(); if (e2.type.isreal()) { if (e1.type.isreal()) diff --git a/gcc/d/dmd/cppmangle.d b/gcc/d/dmd/cppmangle.d index 7a024cefe..46eef6d4e 100644 --- a/gcc/d/dmd/cppmangle.d +++ b/gcc/d/dmd/cppmangle.d @@ -1045,7 +1045,7 @@ private final class CppMangleVisitor : Visitor } if (!substitute(s)) { - cpp_mangle_name(s, t.isConst()); + cpp_mangle_name(s, false); } } if (t.isConst()) @@ -1091,7 +1091,7 @@ private final class CppMangleVisitor : Visitor if (!substitute(t.sym)) { - cpp_mangle_name(t.sym, t.isConst()); + cpp_mangle_name(t.sym, false); } if (t.isConst()) append(null); // C++ would have an extra type here diff --git a/gcc/d/dmd/dcast.d b/gcc/d/dmd/dcast.d index 84d252c9a..cd4fee9dc 100644 --- a/gcc/d/dmd/dcast.d +++ b/gcc/d/dmd/dcast.d @@ -2757,9 +2757,6 @@ Lagain: t2 = Type.basic[ty2]; e1 = e1.castTo(sc, t1); e2 = e2.castTo(sc, t2); - //printf("after typeCombine():\n"); - //print(); - //printf("ty = %d, ty1 = %d, ty2 = %d\n", ty, ty1, ty2); goto Lret; } @@ -3322,7 +3319,6 @@ Lret: printf("\tt2 = %s\n", e2.type.toChars()); printf("\ttype = %s\n", t.toChars()); } - //print(); return true; Lt1: diff --git a/gcc/d/dmd/declaration.d b/gcc/d/dmd/declaration.d index 9f71265d7..50c81c610 100644 --- a/gcc/d/dmd/declaration.d +++ b/gcc/d/dmd/declaration.d @@ -290,7 +290,7 @@ extern (C++) abstract class Declaration : Dsymbol int inuse; // used to detect cycles // overridden symbol with pragma(mangle, "...") - const(char)* mangleOverride; + const(char)[] mangleOverride; final extern (D) this(Identifier id) { diff --git a/gcc/d/dmd/declaration.h b/gcc/d/dmd/declaration.h index 1e16e6a00..62cfde03d 100644 --- a/gcc/d/dmd/declaration.h +++ b/gcc/d/dmd/declaration.h @@ -126,7 +126,7 @@ class Declaration : public Dsymbol Prot protection; LINK linkage; int inuse; // used to detect cycles - const char *mangleOverride; // overridden symbol with pragma(mangle, "...") + DArray mangleOverride; // overridden symbol with pragma(mangle, "...") const char *kind() const; d_uns64 size(const Loc &loc); diff --git a/gcc/d/dmd/dmangle.d b/gcc/d/dmd/dmangle.d index da1fcc4e0..9fa8593b1 100644 --- a/gcc/d/dmd/dmangle.d +++ b/gcc/d/dmd/dmangle.d @@ -530,11 +530,6 @@ public: /************************************************************ * Write length prefixed string to buf. */ - void toBuffer(const(char)* id, Dsymbol s) - { - toBuffer(id[0 .. strlen(id)], s); - } - extern (D) void toBuffer(const(char)[] id, Dsymbol s) { const len = id.length; @@ -867,7 +862,7 @@ public: if (s.ident) mangleIdentifier(s.ident, s); else - toBuffer(s.toChars(), s); + toBuffer(s.toString(), s); //printf("Dsymbol.mangle() %s = %s\n", s.toChars(), id); } diff --git a/gcc/d/dmd/dmodule.d b/gcc/d/dmd/dmodule.d index 7170447a3..546db6105 100644 --- a/gcc/d/dmd/dmodule.d +++ b/gcc/d/dmd/dmodule.d @@ -572,23 +572,29 @@ extern (C++) final class Module : Package */ File* setOutfile(const(char)* name, const(char)* dir, const(char)* arg, const(char)* ext) { - const(char)* docfilename; + return setOutfile(name.toDString(), dir.toDString(), arg.toDString(), ext.toDString()); + } + + /// Ditto + extern(D) File* setOutfile(const(char)[] name, const(char)[] dir, const(char)[] arg, const(char)[] ext) + { + const(char)[] docfilename; if (name) { docfilename = name; } else { - const(char)* argdoc; + const(char)[] argdoc; OutBuffer buf; - if (!strcmp(arg, "__stdin.d")) + if (arg == "__stdin.d") { version (Posix) import core.sys.posix.unistd : getpid; else version (Windows) import core.sys.windows.windows : getpid = GetCurrentProcessId; buf.printf("__stdin_%d.d", getpid()); - arg = buf.peekString(); + arg = buf.peekSlice(); } if (global.params.preservePaths) argdoc = arg; @@ -602,9 +608,9 @@ extern (C++) final class Module : Package } docfilename = FileName.forceExt(argdoc, ext); } - if (FileName.equals(docfilename, srcfile.name.str)) + if (FileName.equals(docfilename, srcfile.name.toString())) { - error("source file and output file have same name '%s'", srcfile.name.str); + error("source file and output file have same name '%s'", srcfile.name.toChars()); fatal(); } return new File(docfilename); diff --git a/gcc/d/dmd/doc.d b/gcc/d/dmd/doc.d index ce49b9113..0a7df87ed 100644 --- a/gcc/d/dmd/doc.d +++ b/gcc/d/dmd/doc.d @@ -51,22 +51,21 @@ import dmd.visitor; struct Escape { - const(char)*[256] strings; + const(char)[][char.max] strings; /*************************************** * Find character string to replace c with. */ - const(char)* escapeChar(uint c) + const(char)[] escapeChar(char c) { version (all) { - assert(c < 256); - //printf("escapeChar('%c') => %p, %p\n", c, strings, strings[c]); + //printf("escapeChar('%c') => %p, %p\n", c, strings, strings[c].ptr); return strings[c]; } else { - const(char)* s; + const(char)[] s; switch (c) { case '<': @@ -185,7 +184,7 @@ private final class ParamSection : Section p++; goto Lcont; default: - if (isIdStart(p) || isCVariadicArg(p, pend - p)) + if (isIdStart(p) || isCVariadicArg(p[0 .. cast(size_t)(pend - p)])) break; if (namelen) goto Ltext; @@ -197,7 +196,7 @@ private final class ParamSection : Section tempstart = p; while (isIdTail(p)) p += utfStride(p); - if (isCVariadicArg(p, pend - p)) + if (isCVariadicArg(p[0 .. cast(size_t)(pend - p)])) p += 3; templen = p - tempstart; while (*p == ' ' || *p == '\t') @@ -229,7 +228,7 @@ private final class ParamSection : Section // 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[0 .. namelen]); if (isCVariadic) { buf.writestring("..."); @@ -317,12 +316,12 @@ private final class MacroSection : Section private alias Sections = Array!(Section); // Workaround for missing Parameter instance for variadic params. (it's unnecessary to instantiate one). -private bool isCVariadicParameter(Dsymbols* a, const(char)* p, size_t len) +private bool isCVariadicParameter(Dsymbols* a, const(char)[] p) { foreach (member; *a) { TypeFunction tf = isTypeFunction(member); - if (tf && tf.varargs == 1 && p[0 .. len] == "...") + if (tf && tf.varargs == 1 && p == "...") return true; } return false; @@ -377,8 +376,7 @@ extern(C++) void gendocfile(Module m) // Override with the ddoc macro files from the command line for (size_t i = 0; i < global.params.ddocfiles.dim; i++) { - auto f = FileName(global.params.ddocfiles[i]); - auto file = File(&f); + auto file = File(global.params.ddocfiles[i].toDString()); readFile(m.loc, &file); // BUG: convert file contents to UTF-8 before use //printf("file: '%.*s'\n", file.len, file.buffer); @@ -394,8 +392,8 @@ extern(C++) void gendocfile(Module m) // Generate predefined macros // Set the title to be the name of the module { - const(char)* p = m.toPrettyChars(); - Macro.define(&m.macrotable, "TITLE", p[0 .. strlen(p)]); + const p = m.toPrettyChars().toDString; + Macro.define(&m.macrotable, "TITLE", p); } // Set time macros { @@ -406,10 +404,10 @@ extern(C++) void gendocfile(Module m) Macro.define(&m.macrotable, "DATETIME", p[0 .. strlen(p)]); Macro.define(&m.macrotable, "YEAR", p[20 .. 20 + 4]); } - const srcfilename = m.srcfile.toChars(); - Macro.define(&m.macrotable, "SRCFILENAME", srcfilename[0 .. strlen(srcfilename)]); - const docfilename = m.docfile.toChars(); - Macro.define(&m.macrotable, "DOCFILENAME", docfilename[0 .. strlen(docfilename)]); + const srcfilename = m.srcfile.toString(); + Macro.define(&m.macrotable, "SRCFILENAME", srcfilename); + const docfilename = m.docfile.toString(); + Macro.define(&m.macrotable, "DOCFILENAME", docfilename); if (dc.copyright) { dc.copyright.nooutput = 1; @@ -784,7 +782,7 @@ private void emitMemberComments(ScopeDsymbol sds, OutBuffer* buf, Scope* sc) if (!sds.members) return; //printf("ScopeDsymbol::emitMemberComments() %s\n", toChars()); - const(char)* m = "$(DDOC_MEMBERS "; + const(char)[] m = "$(DDOC_MEMBERS "; if (sds.isTemplateDeclaration()) m = "$(DDOC_TEMPLATE_MEMBERS "; else if (sds.isClassDeclaration()) @@ -1595,7 +1593,7 @@ struct DocComment size_t len = p - start; char* s = cast(char*)memcpy(mem.xmalloc(len + 1), start, len); s[len] = 0; - escapetable.strings[c] = s; + escapetable.strings[c] = s[0 .. len]; //printf("\t%c = '%s'\n", c, s); p++; } @@ -2096,7 +2094,7 @@ private TemplateParameter isTemplateParameter(Dsymbols* a, const(char)* p, size_ * Return true if str is a reserved symbol name * that starts with a double underscore. */ -private bool isReservedName(const(char)* str, size_t len) +private bool isReservedName(const(char)[] str) { immutable string[] table = [ @@ -2134,7 +2132,7 @@ private bool isReservedName(const(char)* str, size_t len) ]; foreach (s; table) { - if (str[0 .. len] == s) + if (str == s) return true; } return false; @@ -2193,7 +2191,7 @@ private void highlightText(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offset const slice = buf.peekSlice(); auto p = &slice[i]; const se = sc._module.escapetable.escapeChar('<'); - if (se && strcmp(se, "<") == 0) + if (se == "<") { // Generating HTML // Skip over comments @@ -2237,11 +2235,10 @@ private void highlightText(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offset } L1: // Replace '<' with '<' character entity - if (se) + if (se.length) { - const len = strlen(se); buf.remove(i, 1); - i = buf.insert(i, se, len); + i = buf.insert(i, se); i--; // point to ';' } break; @@ -2252,12 +2249,11 @@ private void highlightText(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offset if (inCode) break; // Replace '>' with '>' character entity - const(char)* se = sc._module.escapetable.escapeChar('>'); - if (se) + const se = sc._module.escapetable.escapeChar('>'); + if (se.length) { - size_t len = strlen(se); buf.remove(i, 1); - i = buf.insert(i, se, len); + i = buf.insert(i, se); i--; // point to ';' } break; @@ -2272,12 +2268,11 @@ private void highlightText(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offset break; // already a character entity // Replace '&' with '&' character entity - const(char)* se = sc._module.escapetable.escapeChar('&'); + const se = sc._module.escapetable.escapeChar('&'); if (se) { - size_t len = strlen(se); buf.remove(i, 1); - i = buf.insert(i, se, len); + i = buf.insert(i, se); i--; // point to ';' } break; @@ -2466,7 +2461,7 @@ private void highlightText(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offset break; size_t len = j - i; // leading '_' means no highlight unless it's a reserved symbol name - if (c == '_' && (i == 0 || !isdigit(*(start - 1))) && (i == buf.offset - 1 || !isReservedName(start, len))) + if (c == '_' && (i == 0 || !isdigit(*(start - 1))) && (i == buf.offset - 1 || !isReservedName(start[0 .. len]))) { buf.remove(i, 1); i = buf.bracket(i, "$(DDOC_AUTO_PSYMBOL_SUPPRESS ", j - 1, ")") - 1; @@ -2522,12 +2517,11 @@ private void highlightCode(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offset for (size_t i = offset; i < buf.offset; i++) { char c = buf.data[i]; - const(char)* se = sc._module.escapetable.escapeChar(c); - if (se) + const se = sc._module.escapetable.escapeChar(c); + if (se.length) { - size_t len = strlen(se); buf.remove(i, 1); - i = buf.insert(i, se, len); + i = buf.insert(i, se); i--; // point to ';' continue; } @@ -2634,9 +2628,9 @@ private void highlightCode3(Scope* sc, OutBuffer* buf, const(char)* p, const(cha { for (; p < pend; p++) { - const(char)* s = sc._module.escapetable.escapeChar(*p); - if (s) - buf.writestring(s); + const se = sc._module.escapetable.escapeChar(*p); + if (se.length) + buf.writestring(se); else buf.writeByte(*p); } @@ -2717,9 +2711,9 @@ private void highlightCode2(Scope* sc, Dsymbols* a, OutBuffer* buf, size_t offse /**************************************** * Determine if p points to the start of a "..." parameter identifier. */ -private bool isCVariadicArg(const(char)* p, size_t len) +private bool isCVariadicArg(const(char)[] p) { - return len >= 3 && p[0 .. 3] == "..."; + return p.length >= 3 && p[0 .. 3] == "..."; } /**************************************** diff --git a/gcc/d/dmd/dstruct.d b/gcc/d/dmd/dstruct.d index 4338a24a5..baa761b97 100644 --- a/gcc/d/dmd/dstruct.d +++ b/gcc/d/dmd/dstruct.d @@ -401,9 +401,13 @@ extern (C++) class StructDeclaration : AggregateDeclaration { if (vd._init) { + // Zero size fields are zero initialized + if (vd.type.size(vd.loc) == 0) + continue; + // Examine init to see if it is all 0s. auto exp = vd.getConstInitializer(); - if (!exp || !_isZeroInit(vd.type.toBasetype(), exp)) + if (!exp || !_isZeroInit(exp)) { zeroInit = false; break; @@ -594,95 +598,93 @@ extern (C++) class StructDeclaration : AggregateDeclaration } } -private bool _isZeroInit(Type type, Expression exp) +/********************************** + * Determine if exp is all binary zeros. + * Params: + * exp = expression to check + * Returns: + * true if it's all binary 0 + */ +private bool _isZeroInit(Expression exp) { - if (type.ty == Tsarray) + switch (exp.op) { - auto sarrayType = cast(TypeSArray) type; - const dim = cast(size_t) sarrayType.dim.toInteger(); - auto elementType = type.baseElemOf().toBasetype(); - if (exp.op == TOK.arrayLiteral) + case TOK.int64: + return exp.toInteger() == 0; + + case TOK.null_: + case TOK.false_: + return true; + + case TOK.structLiteral: { - auto arrayExp = cast(ArrayLiteralExp) exp; - foreach (i; 0 .. dim) + auto sle = cast(StructLiteralExp) exp; + foreach (i; 0 .. sle.sd.fields.dim) { - auto ei = arrayExp.getElement(i); - if (ei is null || !_isZeroInit(elementType, ei)) + auto field = sle.sd.fields[i]; + if (field.type.size(field.loc)) { - return false; + auto e = (*sle.elements)[i]; + if (e ? !_isZeroInit(e) + : !field.type.isZeroInit(field.loc)) + return false; } } return true; } - else if (auto stringExp = exp.toStringExp()) + + case TOK.arrayLiteral: { - foreach (i; 0 .. stringExp.len) - if (stringExp.getCodeUnit(i) != 0) + auto ale = cast(ArrayLiteralExp)exp; + + const dim = ale.elements ? ale.elements.dim : 0; + + if (ale.type.toBasetype().ty == Tarray) // if initializing a dynamic array + return dim == 0; + + foreach (i; 0 .. dim) + { + if (!_isZeroInit(ale.getElement(i))) return false; + } + + /* Note that true is returned for all T[0] + */ return true; } - else - { - // Can this happen? - return dim == 0; - } - } - else if (type.ty == Tstruct) - { - // FIXME: is anything special necessary for unions? - if (exp.op == TOK.structLiteral) + + case TOK.string_: { - auto structLiteralExp = cast(StructLiteralExp) exp; - foreach (i; 0 .. structLiteralExp.sd.fields.dim) + StringExp se = cast(StringExp)exp; + + if (se.type.toBasetype().ty == Tarray) // if initializing a dynamic array + return se.len == 0; + + foreach (i; 0 .. se.len) { - auto field = structLiteralExp.sd.fields[i]; - if ((*structLiteralExp.elements)[i] is null - ? !field.type.toBasetype().isZeroInit(field.loc) - : !_isZeroInit(field.type.toBasetype(), (*structLiteralExp.elements)[i])) + if (se.getCodeUnit(i)) return false; } return true; } - else + + case TOK.vector: { - // Can this happen? - return false; + auto ve = cast(VectorExp) exp; + return _isZeroInit(ve.e1); } - } - else if (type.ty == Tvector) - { - auto vectorType = cast(TypeVector) type; - if (exp.op == TOK.vector) + + case TOK.float64: + case TOK.complex80: { - auto vectorExp = cast(VectorExp) exp; - auto e1 = vectorExp.e1; - return e1 !is null && e1.type !is null && _isZeroInit(e1.type, e1); + import dmd.root.ctfloat : CTFloat; + return (exp.toReal() is CTFloat.zero) && + (exp.toImaginary() is CTFloat.zero); } - else - { - // Can this happen? + + default: return false; - } } - else if (exp.op == TOK.arrayLiteral) - { - // Not sure what's going on here but this gets reached with a - // LHS that can't be initialized from an array literal when - // testing Bug10483 in tests/runnable/interpret.d. - return false; - } - else if (type.isintegral) - return exp.toInteger() == 0; - else if (type.isfloating) - { - import dmd.root.ctfloat : CTFloat; - return (exp.toReal() is CTFloat.zero) && (exp.toImaginary() is CTFloat.zero); - } - else if (exp.op == TOK.null_ || exp.op == TOK.false_) - return true; - // Nothing else applied. - else - return false; } /*********************************************************** diff --git a/gcc/d/dmd/dsymbol.d b/gcc/d/dmd/dsymbol.d index 1bc46da52..8b33926a9 100644 --- a/gcc/d/dmd/dsymbol.d +++ b/gcc/d/dmd/dsymbol.d @@ -848,7 +848,6 @@ extern (C++) class Dsymbol : RootObject */ Dsymbol syntaxCopy(Dsymbol s) { - print(); printf("%s %s\n", kind(), toChars()); assert(0); } @@ -2120,21 +2119,6 @@ extern (C++) final class DsymbolTable : RootObject return s; } - debug - { - /** - print the symbol table contents - */ - override void print() - { - printf("SYMBOL TABLE (%d entries)\n------------------------------\n", tab.length); - foreach (keyValue; tab.asRange) - { - printf("%s\n", keyValue.key.toChars()); - } - } - } - // Look for Dsymbol in table. If there, return it. If not, insert s and return that. Dsymbol update(Dsymbol s) { diff --git a/gcc/d/dmd/dsymbolsem.d b/gcc/d/dmd/dsymbolsem.d index 097c6129a..c18512341 100644 --- a/gcc/d/dmd/dsymbolsem.d +++ b/gcc/d/dmd/dsymbolsem.d @@ -349,7 +349,7 @@ private extern (C++) FuncDeclaration buildPostBlit(StructDeclaration sd, Scope* return xpostblit; } -private uint setMangleOverride(Dsymbol s, char* sym) +private uint setMangleOverride(Dsymbol s, const(char)[] sym) { AttribDeclaration ad = s.isAttribDeclaration(); if (ad) @@ -1846,7 +1846,7 @@ private extern(C++) final class DsymbolSemanticVisitor : Visitor char* name = cast(char*)mem.xmalloc(se.len + 1); memcpy(name, se.string, se.len); name[se.len] = 0; - uint cnt = setMangleOverride(s, name); + uint cnt = setMangleOverride(s, name[0 .. se.len]); if (cnt > 1) pd.error("can only apply to a single declaration"); } @@ -4952,7 +4952,6 @@ private extern(C++) final class DsymbolSemanticVisitor : Visitor Module.dprogress++; cldec.semanticRun = PASS.semanticdone; //printf("-ClassDeclaration.dsymbolSemantic(%s), type = %p\n", toChars(), type); - //members.print(); sc2.pop(); @@ -5310,7 +5309,6 @@ private extern(C++) final class DsymbolSemanticVisitor : Visitor Module.dprogress++; idec.semanticRun = PASS.semanticdone; //printf("-InterfaceDeclaration.dsymbolSemantic(%s), type = %p\n", toChars(), type); - //members.print(); sc2.pop(); diff --git a/gcc/d/dmd/dtemplate.d b/gcc/d/dmd/dtemplate.d index 613737f62..d7d27ea75 100644 --- a/gcc/d/dmd/dtemplate.d +++ b/gcc/d/dmd/dtemplate.d @@ -2070,10 +2070,6 @@ extern (C++) final class TemplateDeclaration : ScopeDsymbol } else { - debug - { - o.print(); - } assert(0); } d.storage_class |= STC.templateparameter; @@ -3239,14 +3235,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(Type t) { - version (none) - { - printf("Type.deduceType()\n"); - printf("\tthis = %d, ", t.ty); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } if (!tparam) goto Lnomatch; @@ -3521,14 +3509,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(TypeVector t) { - version (none) - { - printf("TypeVector.deduceType()\n"); - printf("\tthis = %d, ", t.ty); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } if (tparam.ty == Tvector) { TypeVector tp = cast(TypeVector)tparam; @@ -3540,28 +3520,11 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(TypeDArray t) { - version (none) - { - printf("TypeDArray.deduceType()\n"); - printf("\tthis = %d, ", t.ty); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } visit(cast(Type)t); } override void visit(TypeSArray t) { - version (none) - { - printf("TypeSArray.deduceType()\n"); - printf("\tthis = %d, ", t.ty); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } - // Extra check that array dimensions must match if (tparam) { @@ -3614,15 +3577,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(TypeAArray t) { - version (none) - { - printf("TypeAArray.deduceType()\n"); - printf("\tthis = %d, ", t.ty); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } - // Extra check that index type must match if (tparam && tparam.ty == Taarray) { @@ -3638,10 +3592,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(TypeFunction t) { - //printf("TypeFunction.deduceType()\n"); - //printf("\tthis = %d, ", t.ty); t.print(); - //printf("\ttparam = %d, ", tparam.ty); tparam.print(); - // Extra check that function characteristics must match if (tparam && tparam.ty == Tfunction) { @@ -3672,8 +3622,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param fparam.type = tx; } } - //printf("\t. this = %d, ", t.ty); t.print(); - //printf("\t. tparam = %d, ", tparam.ty); tparam.print(); size_t nfargs = Parameter.dim(t.parameters); size_t nfparams = Parameter.dim(tp.parameters); @@ -3794,14 +3742,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(TypeInstance t) { - version (none) - { - printf("TypeInstance.deduceType()\n"); - printf("\tthis = %d, ", t.ty); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } // Extra check if (tparam && tparam.ty == Tinstance && t.tempinst.tempdecl) { @@ -4054,15 +3994,6 @@ MATCH deduceType(RootObject o, Scope* sc, Type tparam, TemplateParameters* param override void visit(TypeStruct t) { - version (none) - { - printf("TypeStruct.deduceType()\n"); - printf("\tthis.parent = %s, ", t.sym.parent.toChars()); - t.print(); - printf("\ttparam = %d, ", tparam.ty); - tparam.print(); - } - /* If this struct is a template struct, and we're matching * it against a template instance, convert the struct type * to a template instance, too, and try again. diff --git a/gcc/d/dmd/expression.d b/gcc/d/dmd/expression.d index eebd5f824..b61349b0f 100644 --- a/gcc/d/dmd/expression.d +++ b/gcc/d/dmd/expression.d @@ -708,7 +708,6 @@ extern (C++) abstract class Expression : RootObject { fprintf(stderr, "No expression copy for: %s\n", toChars()); printf("op = %d\n", op); - print(); } assert(0); } @@ -730,12 +729,6 @@ extern (C++) abstract class Expression : RootObject return DYNCAST.expression; } - override final void print() - { - fprintf(stderr, "%s\n", toChars()); - fflush(stderr); - } - override const(char)* toChars() { OutBuffer buf; @@ -1497,12 +1490,6 @@ extern (C++) abstract class Expression : RootObject Expression toBoolean(Scope* sc) { // Default is 'yes' - do nothing - debug - { - if (!type) - print(); - assert(type); - } Expression e = this; Type t = type; Type tb = type.toBasetype(); diff --git a/gcc/d/dmd/expression.h b/gcc/d/dmd/expression.h index 6cc194433..46c26a0cd 100644 --- a/gcc/d/dmd/expression.h +++ b/gcc/d/dmd/expression.h @@ -128,7 +128,6 @@ class Expression : public RootObject // kludge for template.isExpression() int dyncast() const { return DYNCAST_EXPRESSION; } - void print(); const char *toChars(); void error(const char *format, ...) const; void warning(const char *format, ...) const; diff --git a/gcc/d/dmd/expressionsem.d b/gcc/d/dmd/expressionsem.d index d7645fbac..ee8cf92b9 100644 --- a/gcc/d/dmd/expressionsem.d +++ b/gcc/d/dmd/expressionsem.d @@ -3663,16 +3663,6 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor result = exp; return; // semantic() already run } - version (none) - { - if (exp.arguments && exp.arguments.dim) - { - Expression earg = (*exp.arguments)[0]; - earg.print(); - if (earg.type) - earg.type.print(); - } - } Type t1; Objects* tiargs = null; // initial list of template arguments @@ -8828,11 +8818,6 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor * ' ' ~ c; */ - version (none) - { - exp.e1.type.print(); - exp.e2.type.print(); - } Type tb1next = tb1.nextOf(); Type tb2next = tb2.nextOf(); @@ -8974,13 +8959,6 @@ private extern (C++) final class ExpressionSemanticVisitor : Visitor if (exp.checkPostblit(sc, tbn)) return setError(); } - version (none) - { - exp.e1.type.print(); - exp.e2.type.print(); - exp.type.print(); - exp.print(); - } Type t1 = exp.e1.type.toBasetype(); Type t2 = exp.e2.type.toBasetype(); if ((t1.ty == Tarray || t1.ty == Tsarray) && diff --git a/gcc/d/dmd/gluelayer.d b/gcc/d/dmd/gluelayer.d index d666b64f7..4a8135254 100644 --- a/gcc/d/dmd/gluelayer.d +++ b/gcc/d/dmd/gluelayer.d @@ -35,7 +35,7 @@ version (NoBackend) { // glue void obj_write_deferred(Library library) {} - void obj_start(char* srcfile) {} + void obj_start(const(char)* srcfile) {} void obj_end(Library library, File* objfile) {} void genObjFile(Module m, bool multiobj) {} @@ -67,7 +67,7 @@ else version (MARS) extern (C++) { void obj_write_deferred(Library library); - void obj_start(char* srcfile); + void obj_start(const(char)* srcfile); void obj_end(Library library, File* objfile); void genObjFile(Module m, bool multiobj); diff --git a/gcc/d/dmd/hdrgen.d b/gcc/d/dmd/hdrgen.d index ef0fef36b..a1030f2aa 100644 --- a/gcc/d/dmd/hdrgen.d +++ b/gcc/d/dmd/hdrgen.d @@ -2278,7 +2278,6 @@ public: } assert(precedence[e.op] != PREC.zero); assert(pr != PREC.zero); - //if (precedence[e.op] == 0) e.print(); /* Despite precedence, we don't allow a string; public: static Identifier* create(const char *string); bool equals(RootObject *o); int compare(RootObject *o); - void print(); const char *toChars(); int getValue() const; const char *toHChars2(); diff --git a/gcc/d/dmd/mars.h b/gcc/d/dmd/mars.h index 68b56af80..5c931f765 100644 --- a/gcc/d/dmd/mars.h +++ b/gcc/d/dmd/mars.h @@ -82,7 +82,7 @@ struct OutBuffer; class Dsymbol; class Library; struct File; -void obj_start(char *srcfile); +void obj_start(const char *srcfile); void obj_end(Library *library, File *objfile); void obj_append(Dsymbol *s); void obj_write_deferred(Library *library); diff --git a/gcc/d/dmd/mtype.d b/gcc/d/dmd/mtype.d index 46d5b88aa..a48c2bc8b 100644 --- a/gcc/d/dmd/mtype.d +++ b/gcc/d/dmd/mtype.d @@ -500,8 +500,7 @@ extern (C++) abstract class Type : RootObject Type syntaxCopy() { - print(); - fprintf(stderr, "ty = %d\n", ty); + fprintf(stderr, "this = %s, ty = %d\n", toChars(), ty); assert(0); } diff --git a/gcc/d/dmd/opover.d b/gcc/d/dmd/opover.d index 216b1c536..6707e4348 100644 --- a/gcc/d/dmd/opover.d +++ b/gcc/d/dmd/opover.d @@ -1691,9 +1691,6 @@ extern (C++) Expression build_overload(const ref Loc loc, Scope* sc, Expression { assert(d); Expression e; - //printf("build_overload(id = '%s')\n", id.toChars()); - //earg.print(); - //earg.type.print(); Declaration decl = d.isDeclaration(); if (decl) e = new DotVarExp(loc, ethis, decl, false); diff --git a/gcc/d/dmd/root/file.d b/gcc/d/dmd/root/file.d index f50ea3dec..b8798c367 100644 --- a/gcc/d/dmd/root/file.d +++ b/gcc/d/dmd/root/file.d @@ -29,28 +29,25 @@ struct File int _ref; // != 0 if this is a reference to someone else's buffer ubyte* buffer; // data for our file size_t len; // amount of data in buffer[] - const(FileName)* name; // name of our file + const(FileName) name; // name of our file nothrow: extern (D) this(const(char)* n) + { + this(n.toDString()); + } + + extern (D) this(const(char)[] n) { _ref = 0; buffer = null; len = 0; - name = new FileName(n); + name = FileName(n); } extern (C++) static File* create(const(char)* n) { - return new File(n); - } - - extern (D) this(const(FileName)* n) - { - _ref = 0; - buffer = null; - len = 0; - name = n; + return new File(n.toDString()); } extern (C++) ~this() diff --git a/gcc/d/dmd/root/file.h b/gcc/d/dmd/root/file.h index 7c96705f5..898fc6dd1 100644 --- a/gcc/d/dmd/root/file.h +++ b/gcc/d/dmd/root/file.h @@ -12,18 +12,17 @@ #include #include "array.h" +#include "filename.h" typedef Array Files; -struct FileName; - struct File { int ref; // != 0 if this is a reference to someone else's buffer unsigned char *buffer; // data for our file size_t len; // amount of data in buffer[] - FileName *name; // name of our file + FileName name; // name of our file static File *create(const char *); ~File(); diff --git a/gcc/d/dmd/root/filename.d b/gcc/d/dmd/root/filename.d index dd235d21c..c5b4632c0 100644 --- a/gcc/d/dmd/root/filename.d +++ b/gcc/d/dmd/root/filename.d @@ -43,11 +43,12 @@ alias Files = Array!(File*); struct FileName { nothrow: - const(char)* str; + private const(char)[] str; - extern (D) this(const(char)* str) + /// + extern (D) this(const(char)[] str) { - this.str = mem.xstrdup(str); + this.str = str.xarraydup; } /// Compare two name according to the platform's rules (case sensitive or not) @@ -178,7 +179,7 @@ nothrow: extern (C++) const(char)* ext() const pure { - return ext(str); + return ext(str).ptr; } /******************************** @@ -264,7 +265,7 @@ nothrow: extern (C++) const(char)* name() const pure { - return name(str); + return name(str).ptr; } unittest @@ -577,7 +578,7 @@ nothrow: */ extern (C++) bool equalsExt(const(char)* ext) const pure { - return equalsExt(str, ext); + return equalsExt(str, ext.toDString()); } /************************************* @@ -894,14 +895,16 @@ nothrow: mem.xfree(cast(void*)str); } - extern (C++) const(char)* toChars() const pure nothrow @safe + extern (C++) const(char)* toChars() const pure nothrow @trusted { - return str; + // Since we can return an empty slice (but '\0' terminated), + // we don't do bounds check (as `&str[0]` does) + return str.ptr; } const(char)[] toString() const pure nothrow @trusted { - return str.toDString; + return str; } } diff --git a/gcc/d/dmd/root/filename.h b/gcc/d/dmd/root/filename.h index 9dd3ffab9..6758a845a 100644 --- a/gcc/d/dmd/root/filename.h +++ b/gcc/d/dmd/root/filename.h @@ -10,6 +10,7 @@ #pragma once #include "array.h" +#include "dcompat.h" class RootObject; @@ -18,7 +19,9 @@ typedef Array Strings; struct FileName { - const char *str; +private: + DArray str; +public: FileName(const char *str); static bool equals(const char *name1, const char *name2); static bool absolute(const char *name); diff --git a/gcc/d/dmd/root/object.h b/gcc/d/dmd/root/object.h index d7248e872..b777f6ebc 100644 --- a/gcc/d/dmd/root/object.h +++ b/gcc/d/dmd/root/object.h @@ -50,8 +50,6 @@ class RootObject /** * Pretty-print an Object. Useful for debugging the old-fashioned way. */ - virtual void print(); - virtual const char *toChars(); /// This function is `extern(D)` and should not be called from C++, /// as the ABI does not match on some platforms diff --git a/gcc/d/dmd/root/rootobject.d b/gcc/d/dmd/root/rootobject.d index 7ece1b698..91f4fee2e 100644 --- a/gcc/d/dmd/root/rootobject.d +++ b/gcc/d/dmd/root/rootobject.d @@ -52,11 +52,6 @@ extern (C++) class RootObject assert(0); } - void print() - { - printf("%s %p\n", toChars(), this); - } - const(char)* toChars() { assert(0); diff --git a/gcc/d/dmd/semantic2.d b/gcc/d/dmd/semantic2.d index 768422dd4..6e4ed4b40 100644 --- a/gcc/d/dmd/semantic2.d +++ b/gcc/d/dmd/semantic2.d @@ -245,15 +245,6 @@ private extern(C++) final class Semantic2Visitor : Visitor if (vd._init && !vd.toParent().isFuncDeclaration()) { vd.inuse++; - version (none) - { - ExpInitializer ei = vd._init.isExpInitializer(); - if (ei) - { - ei.exp.print(); - printf("type = %p\n", ei.exp.type); - } - } // https://issues.dlang.org/show_bug.cgi?id=14166 // Don't run CTFE for the temporary variables inside typeof vd._init = vd._init.initializerSemantic(sc, vd.type, sc.intypeof == 1 ? INITnointerpret : INITinterpret); diff --git a/gcc/d/dmd/statement.d b/gcc/d/dmd/statement.d index af4322093..ebfb960c1 100644 --- a/gcc/d/dmd/statement.d +++ b/gcc/d/dmd/statement.d @@ -102,12 +102,6 @@ extern (C++) abstract class Statement : RootObject return b; } - override final void print() - { - fprintf(stderr, "%s\n", toChars()); - fflush(stderr); - } - override final const(char)* toChars() { HdrGenState hgs; @@ -301,7 +295,6 @@ extern (C++) abstract class Statement : RootObject Statement scopeCode(Scope* sc, Statement* sentry, Statement* sexception, Statement* sfinally) { //printf("Statement::scopeCode()\n"); - //print(); *sentry = null; *sexception = null; *sfinally = null; @@ -661,7 +654,6 @@ extern (C++) class ExpStatement : Statement override final Statement scopeCode(Scope* sc, Statement* sentry, Statement* sexception, Statement* sfinally) { //printf("ExpStatement::scopeCode()\n"); - //print(); *sentry = null; *sexception = null; @@ -675,7 +667,6 @@ extern (C++) class ExpStatement : Statement { if (v.needsScopeDtor()) { - //printf("dtor is: "); v.edtor.print(); *sfinally = new DtorExpStatement(loc, v.edtor, v); v.storage_class |= STC.nodtor; // don't add in dtor again } @@ -2079,7 +2070,6 @@ extern (C++) final class OnScopeStatement : Statement override Statement scopeCode(Scope* sc, Statement* sentry, Statement* sexception, Statement* sfinally) { //printf("OnScopeStatement::scopeCode()\n"); - //print(); *sentry = null; *sexception = null; *sfinally = null; diff --git a/gcc/d/dmd/statement.h b/gcc/d/dmd/statement.h index f116c4ad8..6a808291a 100644 --- a/gcc/d/dmd/statement.h +++ b/gcc/d/dmd/statement.h @@ -73,7 +73,6 @@ class Statement : public RootObject virtual Statement *syntaxCopy(); - void print(); const char *toChars(); void error(const char *format, ...); diff --git a/gcc/d/dmd/tokens.d b/gcc/d/dmd/tokens.d index e3ae8d42d..2fd3b744d 100644 --- a/gcc/d/dmd/tokens.d +++ b/gcc/d/dmd/tokens.d @@ -745,14 +745,6 @@ extern (C++) struct Token return 0; } - debug - { - void print() - { - fprintf(stderr, "%s\n", toChars()); - } - } - /**** * Set to contents of ptr[0..length] * Params: diff --git a/gcc/d/dmd/tokens.h b/gcc/d/dmd/tokens.h index cb40f7a8f..c6ab3d3be 100644 --- a/gcc/d/dmd/tokens.h +++ b/gcc/d/dmd/tokens.h @@ -220,9 +220,6 @@ struct Token Token() : next(NULL) {} int isKeyword(); -#ifdef DEBUG - void print(); -#endif const char *toChars() const; static const char *toChars(TOK); }; diff --git a/gcc/d/dmd/traits.d b/gcc/d/dmd/traits.d index a629316d0..ee14fa9bf 100644 --- a/gcc/d/dmd/traits.d +++ b/gcc/d/dmd/traits.d @@ -926,7 +926,6 @@ extern (C++) Expression semanticTraits(TraitsExp e, Scope* sc) ex = ex.expressionSemantic(scx); if (errors < global.errors) e.error("`%s` cannot be resolved", eorig.toChars()); - //ex.print(); /* Create tuple of functions of ex */ @@ -1646,7 +1645,36 @@ extern (C++) Expression semanticTraits(TraitsExp e, Scope* sc) if (cmp(s1,s2) || cmp(s2,s1)) return True(); - return (s1 == s2) ? True() : False(); + if (s1 == s2) + return True(); + + // https://issues.dlang.org/show_bug.cgi?id=18771 + // OverloadSets are equal if they contain the same functions + auto overSet1 = s1.isOverloadSet(); + if (!overSet1) + return False(); + + auto overSet2 = s2.isOverloadSet(); + if (!overSet2) + return False(); + + if (overSet1.a.dim != overSet2.a.dim) + return False(); + + // OverloadSets contain array of Dsymbols => O(n*n) + // to compare for equality as the order of overloads + // might not be the same +Lnext: + foreach(overload1; overSet1.a) + { + foreach(overload2; overSet2.a) + { + if (overload1 == overload2) + continue Lnext; + } + return False(); + } + return True(); } if (e.ident == Id.getUnitTests) { diff --git a/gcc/d/dmd/typesem.d b/gcc/d/dmd/typesem.d index cc6dab9c2..f144b3f3e 100644 --- a/gcc/d/dmd/typesem.d +++ b/gcc/d/dmd/typesem.d @@ -1672,8 +1672,6 @@ private extern (C++) final class TypeSemanticVisitor : Visitor { if (mtype.cppmangle == CPPMANGLE.def) mtype.cppmangle = sc.cppmangle; - else - assert(mtype.cppmangle == sc.cppmangle); } result = mtype; return; @@ -1688,8 +1686,11 @@ private extern (C++) final class TypeSemanticVisitor : Visitor if (mtype.sym.type.ty == Terror) return error(); - if (sc) + if (sc && sc.cppmangle != CPPMANGLE.def) mtype.cppmangle = sc.cppmangle; + else + mtype.cppmangle = CPPMANGLE.asStruct; + result = merge(mtype); } @@ -1708,8 +1709,6 @@ private extern (C++) final class TypeSemanticVisitor : Visitor { if (mtype.cppmangle == CPPMANGLE.def) mtype.cppmangle = sc.cppmangle; - else - assert(mtype.cppmangle == sc.cppmangle); } result = mtype; return; @@ -1724,8 +1723,11 @@ private extern (C++) final class TypeSemanticVisitor : Visitor if (mtype.sym.type.ty == Terror) return error(); - if (sc) + if (sc && sc.cppmangle != CPPMANGLE.def) mtype.cppmangle = sc.cppmangle; + else + mtype.cppmangle = CPPMANGLE.asClass; + result = merge(mtype); } diff --git a/gcc/testsuite/gdc.test/compilable/cppmangle.d b/gcc/testsuite/gdc.test/compilable/cppmangle.d index e744db088..84456e421 100644 --- a/gcc/testsuite/gdc.test/compilable/cppmangle.d +++ b/gcc/testsuite/gdc.test/compilable/cppmangle.d @@ -740,9 +740,17 @@ extern(C++, Namespace18922) version (Posix) { + // https://godbolt.org/z/C5T2LQ + /+ + namespace std + { + struct test18957 {}; + } + void test18957(const std::test18957& t) {} + +/ extern (C++) void test18957(ref const(std.test18957) t) {} - static assert(test18957.mangleof == "_Z9test18957RKNSt9test18957E"); + static assert(test18957.mangleof == "_Z9test18957RKSt9test18957"); } /**************************************/ diff --git a/gcc/testsuite/gdc.test/compilable/imports/test18771a.d b/gcc/testsuite/gdc.test/compilable/imports/test18771a.d new file mode 100644 index 000000000..7527c3115 --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/imports/test18771a.d @@ -0,0 +1,3 @@ +module imports.test18771a; + +void foo(int) {} diff --git a/gcc/testsuite/gdc.test/compilable/imports/test18771b.d b/gcc/testsuite/gdc.test/compilable/imports/test18771b.d new file mode 100644 index 000000000..f48dc5f1d --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/imports/test18771b.d @@ -0,0 +1,3 @@ +module imports.test18771b; + +void foo(string) {} diff --git a/gcc/testsuite/gdc.test/compilable/imports/test18771c.d b/gcc/testsuite/gdc.test/compilable/imports/test18771c.d new file mode 100644 index 000000000..dc986d2f1 --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/imports/test18771c.d @@ -0,0 +1,4 @@ +module imports.test18771c; + +import imports.test18771a, imports.test18771b; +alias fooC = foo; diff --git a/gcc/testsuite/gdc.test/compilable/imports/test18771d.d b/gcc/testsuite/gdc.test/compilable/imports/test18771d.d new file mode 100644 index 000000000..fbf203464 --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/imports/test18771d.d @@ -0,0 +1,4 @@ +module imports.test18771d; + +import imports.test18771b, imports.test18771a; +alias fooD = foo; diff --git a/gcc/testsuite/gdc.test/compilable/test18771.d b/gcc/testsuite/gdc.test/compilable/test18771.d new file mode 100644 index 000000000..a9b2343e2 --- /dev/null +++ b/gcc/testsuite/gdc.test/compilable/test18771.d @@ -0,0 +1,6 @@ +// REQUIRED_ARGS : -c +// https://issues.dlang.org/show_bug.cgi?id=18771 + +import imports.test18771c, imports.test18771d; + +static assert(__traits(isSame, fooC, fooD)); diff --git a/gcc/testsuite/gdc.test/runnable/cpp_abi_tests.d b/gcc/testsuite/gdc.test/runnable/cpp_abi_tests.d index f0c0c0979..afab5646c 100644 --- a/gcc/testsuite/gdc.test/runnable/cpp_abi_tests.d +++ b/gcc/testsuite/gdc.test/runnable/cpp_abi_tests.d @@ -7,6 +7,11 @@ struct S float a = 1; } +extern(C++, std) +{ + struct test19248 {int a = 34;} +} + bool passthrough(bool value); byte passthrough(byte value); ubyte passthrough(ubyte value); @@ -21,6 +26,7 @@ ulong passthrough(ulong value); float passthrough(float value); double passthrough(double value); S passthrough(S value); +std.test19248 passthrough(const(std.test19248) value); bool passthrough_ptr(bool *value); byte passthrough_ptr(byte *value); @@ -36,6 +42,7 @@ ulong passthrough_ptr(ulong *value); float passthrough_ptr(float *value); double passthrough_ptr(double *value); S passthrough_ptr(S *value); +std.test19248 passthrough_ptr(const(std.test19248)* value); bool passthrough_ref(ref bool value); byte passthrough_ref(ref byte value); @@ -51,6 +58,7 @@ ulong passthrough_ref(ref ulong value); float passthrough_ref(ref float value); double passthrough_ref(ref double value); S passthrough_ref(ref S value); +std.test19248 passthrough_ref(ref const(std.test19248) value); } template IsSigned(T) @@ -154,4 +162,5 @@ void main() foreach(float val; values!float()) check(val); foreach(double val; values!double()) check(val); check(S()); + check(std.test19248()); } diff --git a/gcc/testsuite/gdc.test/runnable/extra-files/cpp_abi_tests.cpp b/gcc/testsuite/gdc.test/runnable/extra-files/cpp_abi_tests.cpp index 63f74a280..ff4990d47 100644 --- a/gcc/testsuite/gdc.test/runnable/extra-files/cpp_abi_tests.cpp +++ b/gcc/testsuite/gdc.test/runnable/extra-files/cpp_abi_tests.cpp @@ -2,6 +2,11 @@ struct S{ float a; }; +namespace std +{ + struct test19248 {int a;}; +}; + bool passthrough(bool value) { return value; } signed char passthrough(signed char value) { return value; } unsigned char passthrough(unsigned char value) { return value; } @@ -18,6 +23,7 @@ unsigned long long passthrough(unsigned long long value) { return value; } float passthrough(float value) { return value; } double passthrough(double value) { return value; } S passthrough(S value) { return value; } +std::test19248 passthrough(const std::test19248 value) { return value; } bool passthrough_ptr(bool *value) { return *value; } signed char passthrough_ptr(signed char *value) { return *value; } @@ -35,6 +41,7 @@ unsigned long long passthrough_ptr(unsigned long long *value) { return *value; } float passthrough_ptr(float *value) { return *value; } double passthrough_ptr(double *value) { return *value; } S passthrough_ptr(S *value) { return *value; } +std::test19248 passthrough_ptr(const std::test19248 *value) { return *value; } bool passthrough_ref(bool &value) { return value; } signed char passthrough_ref(signed char &value) { return value; } @@ -52,6 +59,7 @@ unsigned long long passthrough_ref(unsigned long long &value) { return value; } float passthrough_ref(float &value) { return value; } double passthrough_ref(double &value) { return value; } S passthrough_ref(S &value) { return value; } +std::test19248 passthrough_ref(const std::test19248 &value) { return value; } // Uncomment when mangling is fixed // typedef void(*fn0)(); diff --git a/libphobos/libdruntime/core/thread.d b/libphobos/libdruntime/core/thread.d index cca787f4a..d715e65fb 100644 --- a/libphobos/libdruntime/core/thread.d +++ b/libphobos/libdruntime/core/thread.d @@ -4073,46 +4073,6 @@ private * as ARM_SoftFP) this can cause problems. Druntime must be compiled as * ARM_SoftFP in this case. * - * Example: - * ---------------------------------------------------------------------- - * - * class DerivedFiber : Fiber - * { - * this() - * { - * super( &run ); - * } - * - * private : - * void run() - * { - * printf( "Derived fiber running.\n" ); - * } - * } - * - * void fiberFunc() - * { - * printf( "Composed fiber running.\n" ); - * Fiber.yield(); - * printf( "Composed fiber running.\n" ); - * } - * - * // create instances of each type - * Fiber derived = new DerivedFiber(); - * Fiber composed = new Fiber( &fiberFunc ); - * - * // call both fibers once - * derived.call(); - * composed.call(); - * printf( "Execution returned to calling context.\n" ); - * composed.call(); - * - * // since each fiber has run to completion, each should have state TERM - * assert( derived.state == Fiber.State.TERM ); - * assert( composed.state == Fiber.State.TERM ); - * - * ---------------------------------------------------------------------- - * * Authors: Based on a design by Mikola Lysenko. */ class Fiber @@ -5195,6 +5155,53 @@ private: } } +/// +unittest { + int counter; + + class DerivedFiber : Fiber + { + this() + { + super( &run ); + } + + private : + void run() + { + counter += 2; + } + } + + void fiberFunc() + { + counter += 4; + Fiber.yield(); + counter += 8; + } + + // create instances of each type + Fiber derived = new DerivedFiber(); + Fiber composed = new Fiber( &fiberFunc ); + + assert( counter == 0 ); + + derived.call(); + assert( counter == 2, "Derived fiber increment." ); + + composed.call(); + assert( counter == 6, "First composed fiber increment." ); + + counter += 16; + assert( counter == 22, "Calling context increment." ); + + composed.call(); + assert( counter == 30, "Second composed fiber increment." ); + + // since each fiber has run to completion, each should have state TERM + assert( derived.state == Fiber.State.TERM ); + assert( composed.state == Fiber.State.TERM ); +} version( unittest ) {