From 1c63105c0cfc9d75b3c07bcb242a2863003874d3 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Sun, 10 Mar 2019 16:29:48 +0000 Subject: [PATCH] re PR d/88958 (ICE in walk_aliased_vdefs_1, at tree-ssa-alias.c:2887) PR d/88958 d/dmd: Merge upstream dmd 0fc786f49 Backport fix to disallow passing functions as parameters. Fixes https://gcc.gnu.org/PR88958 Reviewed-on: https://github.com/dlang/dmd/pull/9437 From-SVN: r269557 --- gcc/d/dmd/MERGE | 2 +- gcc/d/dmd/expressionsem.c | 6 ++++++ .../gdc.test/fail_compilation/test19608.d | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gdc.test/fail_compilation/test19608.d diff --git a/gcc/d/dmd/MERGE b/gcc/d/dmd/MERGE index 3f416dbfb7b..98bf8254554 100644 --- a/gcc/d/dmd/MERGE +++ b/gcc/d/dmd/MERGE @@ -1,4 +1,4 @@ -d517c0e6a10b548f44d82b71b3c079663cb94f8e +0fc786f4908aa6bdd4220af87995333b1f24c3d7 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/expressionsem.c b/gcc/d/dmd/expressionsem.c index 3fd5c1fa33f..bcc1ac9ed2f 100644 --- a/gcc/d/dmd/expressionsem.c +++ b/gcc/d/dmd/expressionsem.c @@ -102,6 +102,12 @@ static bool preFunctionParameters(Scope *sc, Expressions *exps) arg = new ErrorExp(); err = true; } + else if (arg->type->toBasetype()->ty == Tfunction) + { + arg->error("cannot pass type %s as a function argument", arg->toChars()); + arg = new ErrorExp(); + err = true; + } else if (checkNonAssignmentArrayOp(arg)) { arg = new ErrorExp(); diff --git a/gcc/testsuite/gdc.test/fail_compilation/test19608.d b/gcc/testsuite/gdc.test/fail_compilation/test19608.d new file mode 100644 index 00000000000..cea84a6bd50 --- /dev/null +++ b/gcc/testsuite/gdc.test/fail_compilation/test19608.d @@ -0,0 +1,16 @@ +// https://issues.dlang.org/show_bug.cgi?id=19608 +/* +TEST_OUTPUT: +--- +fail_compilation/test19608.d(15): Error: cannot pass function `*& f` as a function argument +--- +*/ +import core.stdc.stdarg; + +void f(int) {} +void g(...) {} +void h() +{ + g(&f); // OK, function address + g(*&f); // ICE -> Error +} -- 2.30.2