Merge remote-tracking branch 'upstream/stable' into merge_stable

This commit is contained in:
Martin Nowak 2019-01-02 02:42:28 +01:00
commit 543d7524db
20 changed files with 78 additions and 130 deletions

View file

@ -1 +1 @@
v2.084.0-rc.1
v2.084.0

View file

@ -1,27 +0,0 @@
Aliases can be created directly from a `__trait`.
Aliases can be created directly from the traits that return symbol(s) or tuples.
This includes `getMember`, `allMembers`, `derivedMembers`, `parent`, `getOverloads`,
`getVirtualFunctions`, `getVirtualMethods`, `getUnitTests`, `getAttributes` and finally `getAliasThis`.
Previously an `AliasSeq` was necessary in order to alias their return.
Now the grammar allows to write shorter declarations:
---
struct Foo
{
static int a;
}
alias oldWay = AliasSeq!(__traits(getMember, Foo, "a"))[0];
alias newWay = __traits(getMember, Foo, "a");
---
To permit this it was more interesting to include `__trait` in the basic types
rather than just changing the alias syntax. So additionally, wherever a type appears
a `__trait` can be used, for example in a variable declaration:
---
struct Foo { static struct Bar {} }
const(__traits(getMember, Foo, "Bar")) fooBar;
static assert(is(typeof(fooBar) == const(Foo.Bar)));
---

View file

@ -1,18 +0,0 @@
Added -check switch to turn on and off each category of runtime checks.
Option("check=[assert|bounds|in|invariant|out|switch][=[on|off]]",
`Overrides default, -boundscheck, -release and -unittest options to enable or disable specific checks.
$(UL
$(LI $(B assert): assertion checking)
$(LI $(B bounds): array bounds)
$(LI $(B in): in contracts)
$(LI $(B invariant): class/struct invariants)
$(LI $(B out): out contracts)
$(LI $(B switch): switch default)
)
$(UL
$(LI $(B on) or not specified: specified check is enabled.)
$(LI $(B off): specified check is disabled.)
)`
)

View file

@ -1,8 +0,0 @@
Add `-checkaction=D|C|halt` compiler switch.
It covers action taken when an assert fails, a bounds check fails,
or a final switch error happens. D means the usual D behavior of
throwing an `Error`, C means call the C runtime library assert failure
function, and halt means halt the program execution.
The halt is the main addition here, it enables very lightweight assert's.

View file

@ -1,21 +0,0 @@
`-color` and `-color=on` will now always output colorized console output
Before this release `-color` wouldn't output colorized console output if
the terminal detection failed.
With this release, a new option `auto` is introduced for `-color=<value>`
which will continue to be the default:
$(UL
$(LI `auto`: enable colorized output if a tty is detected (default))
$(LI `on`: always use colored output.)
$(LI `off`: never use colored output.)
)
Hence, it is now possible to use `-color` (a shortcut for `-color=on`) to
force DMD to emit colorized console output.
For example, this will now use colorized console output:
$(CONSOLE
> echo $(DOLLAR)(echo "test" | dmd -color - 2>&1)
__stdin.d(2): $(RED Error): no identifier for declarator $(B test)
)

View file

@ -1,3 +0,0 @@
The code generated by `mixin` statements can now be saved with -mixin
This is useful to debug errors in compilation and provides source for debuggers to show when requested.

View file

@ -1,9 +0,0 @@
Deprecate invalid binary literals
Prior to this release, binary literals without any digits after the prefix `0b`
were considered valid. This has now been deprecated.
---
auto foo = 0b; // deprecated
auto bar = 0b_; // deprecated
auto baz = 0b0; // conforming equivalent
---

View file

@ -1,4 +0,0 @@
Deprecated `extern(Pascal)` linkage
This linkage is completely unused, being an heritage from a few decades ago.
Additionally, it's only supported by DMD and cause mangling ambiguity.

View file

@ -1,20 +0,0 @@
The deprecation phase for fully qualified names that bypassed private imports is finished
---
// a.d
import std.stdio;
---
---
// b.d
import a;
void main()
{
std.stdio.writefln("foo"); // deprecation before patch, now errors
}
---
In order to compile the example successfully, `public` needs to be added
to the import located in `a.d` : `public import std.stdio;` or `import std.stdio;`
needs to be added to `b.d`.

View file

@ -1,4 +0,0 @@
Templates are now mangled correctly on POSIX
Before this version, anything including `extern(C++)` templates
was not correctly mangled on OSX, Linux, and FreeBSD, leading to linker errors.

View file

@ -1,5 +0,0 @@
Added `__c_wchar_t` as a correct mangling type for C's `wchar_t`
This allows code interfacing with C++ that uses `wchar_t` to link correctly.
It replaces `wchar` (Windows) and `dchar` (Posix) as the memory type for the
DRuntime alias `wchar_t`.

View file

@ -443,7 +443,7 @@ void cdeq(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
postinc = e11.EV.E2.EV.Vint;
if (e11.Eoper == OPpostdec)
postinc = -postinc;
getlvalue(cdb,&cs,e11,RMstore);
getlvalue(cdb,&cs,e1,RMstore);
freenode(e11.EV.E2);
}
else
@ -710,10 +710,8 @@ void cdeq(ref CodeBuilder cdb,elem *e,regm_t *pretregs)
postinc = e11.EV.E2.EV.Vint;
if (e11.Eoper == OPpostdec)
postinc = -postinc;
getlvalue(cdb,&cs,e11,RMstore | retregs);
getlvalue(cdb,&cs,e1,RMstore | retregs);
freenode(e11.EV.E2);
if (I64 && sz < 8)
cs.Irex &= ~REX_W; // incorrectly set by getlvalue()
}
else
{

View file

@ -483,6 +483,8 @@ public:
bool naked; // true if naked
bool generated; // true if function was generated by the compiler rather than
// supplied by the user
unsigned char isCrtCtorDtor; // has attribute pragma(crt_constructor(1)/crt_destructor(2))
// not set before the glue layer
ILS inlineStatusStmt;
ILS inlineStatusExp;
PINLINE inlining;

View file

@ -231,6 +231,9 @@ extern (C++) class FuncDeclaration : Declaration
bool naked; /// true if naked
bool generated; /// true if function was generated by the compiler rather than
/// supplied by the user
ubyte isCrtCtorDtor; /// has attribute pragma(crt_constructor(1)/crt_destructor(2))
/// not set before the glue layer
ILS inlineStatusStmt = ILS.uninitialized;
ILS inlineStatusExp = ILS.uninitialized;
PINLINE inlining = PINLINE.default_;

View file

@ -762,7 +762,7 @@ void FuncDeclaration_toObjFile(FuncDeclaration fd, bool multiobj)
if (ud && !global.params.useUnitTests)
return;
if (multiobj && !fd.isStaticDtorDeclaration() && !fd.isStaticCtorDeclaration())
if (multiobj && !fd.isStaticDtorDeclaration() && !fd.isStaticCtorDeclaration() && !fd.isCrtCtorDtor)
{
obj_append(fd);
return;
@ -1244,6 +1244,11 @@ void FuncDeclaration_toObjFile(FuncDeclaration fd, bool multiobj)
if (fd.isExport())
objmod.export_symbol(s, cast(uint)Para.offset);
if (fd.isCrtCtorDtor & 1)
objmod.setModuleCtorDtor(s, true);
if (fd.isCrtCtorDtor & 2)
objmod.setModuleCtorDtor(s, false);
foreach (sd; *irs.deferToObj)
{
toObjFile(sd, false);

View file

@ -772,10 +772,7 @@ void toObjFile(Dsymbol ds, bool multiobj)
obj_linkerdirective(directive);
}
visit(cast(AttribDeclaration)pd);
if (pd.ident == Id.crt_constructor || pd.ident == Id.crt_destructor)
else if (pd.ident == Id.crt_constructor || pd.ident == Id.crt_destructor)
{
immutable isCtor = pd.ident == Id.crt_constructor;
@ -794,7 +791,7 @@ void toObjFile(Dsymbol ds, bool multiobj)
}
else if (auto f = s.isFuncDeclaration())
{
objmod.setModuleCtorDtor(s.csym, isCtor);
f.isCrtCtorDtor |= isCtor ? 1 : 2;
if (f.linkage != LINK.c)
f.error("must be `extern(C)` for `pragma(%s)`", isCtor ? "crt_constructor".ptr : "crt_destructor".ptr);
return 1;
@ -807,6 +804,8 @@ void toObjFile(Dsymbol ds, bool multiobj)
if (recurse(pd, isCtor) > 1)
pd.error("can only apply to a single declaration");
}
visit(cast(AttribDeclaration)pd);
}
override void visit(TemplateInstance ti)

View file

@ -0,0 +1,8 @@
__gshared int initVar;
pragma(crt_constructor)
extern(C) void mir_cpuid_crt_init()
{
initVar = 42;
}

View file

@ -0,0 +1,6 @@
import lib18456;
void main()
{
assert(initVar == 42);
}

View file

@ -1838,6 +1838,44 @@ void test18730() // https://issues.dlang.org/show_bug.cgi?id=18730
////////////////////////////////////////////////////////////////////////
void test19497() // https://issues.dlang.org/show_bug.cgi?id=19497
{
{
ubyte[1024] data;
ushort* ushortPtr = cast(ushort*) data.ptr;
*ushortPtr++ = 0xfe00;
printf("ushortPtr(%p)\n", ushortPtr);
fflush(stdout);
}
alias Seq(stuff ...) = stuff;
static foreach (T; Seq!(ubyte, ushort, uint, ulong, byte, short, int, long))
{{
T[2] data = 0x2A;
T* q = &data[0];
*q++ = cast(T) 0x1122334455667788;
if (*q != 0x2A) assert(false);
}}
{
static int toStringz(string s) { return s.length > 0 ? s[0] : 0; }
static void toAStringz(in string[] a, int* az)
{
foreach (string s; a)
{
*az++ = toStringz(s);
}
}
string[1] sa = ["abc"];
int[2] tgt = 0x2a;
toAStringz(sa[], tgt.ptr);
if (tgt[0] != 'a') assert(false);
if (tgt[1] != 0x2a) assert(false);
}
}
////////////////////////////////////////////////////////////////////////
int main()
{
testgoto();
@ -1903,6 +1941,7 @@ int main()
test18315();
test18461();
test18730();
test19497();
printf("Success\n");
return 0;

View file

@ -0,0 +1,7 @@
#!/usr/bin/env bash
$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${LIBEXT} -lib ${EXTRA_FILES}/lib18456.d
$DMD -m${MODEL} -I${EXTRA_FILES} -of${OUTPUT_BASE}${EXE} ${EXTRA_FILES}/test18456.d ${OUTPUT_BASE}${LIBEXT}
${OUTPUT_BASE}${EXE}
rm ${OUTPUT_BASE}{${LIBEXT},${EXE}}