From: Iain Buclaw Date: Tue, 23 Jun 2020 20:43:27 +0000 (+0200) Subject: d: Fix ICE during error recovery in semantic pass X-Git-Tag: releases/gcc-10.2.0~141 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=95f5dc7f70b09def9f2002f5cbef986b21d456e3;p=thirdparty%2Fgcc.git 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) --- 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 }