From 95f5dc7f70b09def9f2002f5cbef986b21d456e3 Mon Sep 17 00:00:00 2001 From: Iain Buclaw Date: Tue, 23 Jun 2020 22:43:27 +0200 Subject: [PATCH] d: Fix ICE during error recovery in semantic pass Fixes a regression caused by an incomplete backport of converting the Expression semantic pass to a Visitor. gcc/d/ChangeLog: PR d/95250 * dmd/expressionsem.c (class ExpressionSemanticVisitor): Return early if error occurred during semantic of DivExp. gcc/testsuite/ChangeLog: PR d/95250 * gdc.dg/pr95250.d: New test. (cherry picked from commit 1d19c9cd3dd99ba8885c0fc93223918399f73939) --- gcc/d/dmd/expressionsem.c | 1 + gcc/testsuite/gdc.dg/pr95250.d | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 gcc/testsuite/gdc.dg/pr95250.d diff --git a/gcc/d/dmd/expressionsem.c b/gcc/d/dmd/expressionsem.c index 629768aaf067..3221a8ae1121 100644 --- a/gcc/d/dmd/expressionsem.c +++ b/gcc/d/dmd/expressionsem.c @@ -6887,6 +6887,7 @@ public: if (Expression *ex = binSemanticProp(exp, sc)) { result = ex; + return; } Expression *e = exp->op_overload(sc); if (e) diff --git a/gcc/testsuite/gdc.dg/pr95250.d b/gcc/testsuite/gdc.dg/pr95250.d new file mode 100644 index 000000000000..dfb8abb732f0 --- /dev/null +++ b/gcc/testsuite/gdc.dg/pr95250.d @@ -0,0 +1,18 @@ +// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95250 +// { dg-do compile } + +template Unsigned(T) +{ + static assert(false, "Type " ~ T.stringof ~ + " does not have an Unsigned counterpart"); +} + + +void* f(T)(T a, T b) +{ + alias UnsignedVoid = Unsigned!(T); + return cast(T)(cast(T)(cast(UnsignedVoid)(a-b) / 2)); +} + +static assert(is(typeof(f!(void*)(null, null)) == void*)); +// { dg-error "static assert \(.*\) is false" "" { target *-*-* } .-1 } -- 2.47.2