<html><body><div style="font-family: arial, helvetica, sans-serif; font-size: 12pt; color: #000000"><div><br></div><div><br></div><hr id="zwchr" data-marker="__DIVIDER__"><div data-marker="__HEADERS__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><b>From: </b>"Red IO" <redio.development@gmail.com><br><b>To: </b>"jan lahoda" <jan.lahoda@oracle.com>, "amber-dev" <amber-dev@openjdk.org><br><b>Sent: </b>Monday, November 14, 2022 9:42:00 PM<br><b>Subject: </b>AW: switch exhaustiveness check not working within deconstruction pattern. <br></blockquote></div><div><style><!--
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:Consolas;
panose-1:2 11 6 9 2 2 4 3 2 4;}
@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
text-decoration:underline;}
span.contentpasted0
{mso-style-name:contentpasted0;}
p.xmsonormal, li.xmsonormal, div.xmsonormal
{mso-style-name:x_msonormal;
margin:0cm;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.E-MailFormatvorlage22
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}
@page WordSection1
{size:612.0pt 792.0pt;
margin:70.85pt 70.85pt 2.0cm 70.85pt;}
div.WordSection1
{page:WordSection1;}
--></style></div><div data-marker="__QUOTED_TEXT__"><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div class="WordSection1"><p class="MsoNormal">I use VSCode with the “Extension Pack for Java”.</p><p class="MsoNormal">I back checked on my (still linting) code using javac directly and it’s in fact not an error there. </p><p class="MsoNormal">I assumed the (error) linting of the VSCode extension was based on javac output.<br>But I guess it’s a bug in their own code checking system unrelated to javac output. </p><p class="MsoNormal">I will open an issue on the extension instead.</p><p class="MsoNormal">Sorry to bother you and take your time for this.</p></div></blockquote><div><br></div><div>The linting in VSCode is based on ecj, the eclipse compiler so it seems there is a bug in ecj.<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div class="WordSection1"><p class="MsoNormal"> </p><p class="MsoNormal">Great regards </p><p class="MsoNormal">RedIODev</p></div></blockquote><div><br></div><div>regards,<br data-mce-bogus="1"></div><div>Rémi<br data-mce-bogus="1"></div><div><br data-mce-bogus="1"></div><blockquote style="border-left:2px solid #1010FF;margin-left:5px;padding-left:5px;color:#000;font-weight:normal;font-style:normal;text-decoration:none;font-family:Helvetica,Arial,sans-serif;font-size:12pt;"><div class="WordSection1"><p class="MsoNormal"> </p><div><div style="border:none;border-top:solid #E1E1E1 1.0pt;padding:3.0pt 0cm 0cm 0cm"><p class="MsoNormal"><b><span lang="DE">Von:</span></b><span lang="DE"> Jan Lahoda <jan.lahoda@oracle.com> <br><b>Gesendet:</b> Montag, 14. November 2022 12:41<br><b>An:</b> redio.development@gmail.com; amber-dev@openjdk.org<br><b>Betreff:</b> Re: switch exhaustiveness check not working within deconstruction pattern. </span></p></div></div><p class="MsoNormal"> </p><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black">Hi,</span></p></div><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black">This should indeed be exhaustive, AFAIK, and javac from JDK 19 seems to be happy with the code:</span></p></div><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black">---</span></p></div><div><p class="MsoNormal" style="background:white"><span class="contentpasted0"><span style="font-size:12.0pt;font-family:"Courier New";color:black;background:white">$ ./javac --enable-preview -source 19 /tmp/Main.java </span></span></p></div><div><p class="MsoNormal" style="background:white"><span class="contentpasted0"><span style="font-size:12.0pt;font-family:"Courier New";color:black">Note: /tmp/Main.java uses preview features of Java SE 19. </span></span><span style="font-size:12.0pt;font-family:"Courier New";color:black"><br><span class="contentpasted0">Note: Recompile with -Xlint:preview for details. </span></span></p></div><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black">---</span></p></div><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black">What are the precise steps to reproduce/JDK version?</span></p></div><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black">Thanks,</span></p></div><div><p class="MsoNormal" style="background:white"><span style="font-size:12.0pt;color:black"> Jan</span></p></div><div class="MsoNormal" style="text-align:center" align="center"><hr width="98%" size="2" align="center"></div><div id="divRplyFwdMsg"><p class="MsoNormal"><b><span style="color:black">From:</span></b><span style="color:black"> amber-dev <<a href="mailto:amber-dev-retn@openjdk.org" target="_blank">amber-dev-retn@openjdk.org</a>> on behalf of <a href="mailto:redio.development@gmail.com" target="_blank">redio.development@gmail.com</a> <<a href="mailto:redio.development@gmail.com" target="_blank">redio.development@gmail.com</a>><br><b>Sent:</b> Sunday, November 13, 2022 6:48 PM<br><b>To:</b><a href="mailto:amber-dev@openjdk.org" target="_blank">amber-dev@openjdk.org</a> <<a href="mailto:amber-dev@openjdk.org" target="_blank">amber-dev@openjdk.org</a>><br><b>Subject:</b> switch exhaustiveness check not working within deconstruction pattern. </span></p><div><p class="MsoNormal"> </p></div></div><div><div><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">package</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">dev</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">redio</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">import</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">static</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">dev</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">redio</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Main</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.*;</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">public</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">class</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Main</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> {</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">public</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">static</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">void</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">main</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">String</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">[] </span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">args</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) {</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">record</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">boolean</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">weekend</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) {}</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">var</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> = </span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">new</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">Pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">true</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">new</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">Sleeping</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#B5CEA8">8</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">));</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">var</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">msg</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> = </span><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">switch</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> (</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) { </span><span style="font-size:10.5pt;font-family:Consolas;color:#6A9955">// <- A switch expression should have a default case Java(1073743531)</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">case</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">Pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">boolean</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">b</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Sleeping</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">s</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">-></span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"3"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">case</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">Pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">boolean</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">b</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Skiing</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">s</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">-></span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"4"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#C586C0">case</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">Pair</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">boolean</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">b</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">, </span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Coding</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">c</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">-></span><span style="font-size:10.5pt;font-family:Consolas;color:#CE9178">"5"</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">;</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> };</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">System</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#4FC1FF">out</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">.</span><span style="font-size:10.5pt;font-family:Consolas;color:#DCDCAA">println</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">msg</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">);</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> }</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">sealed</span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">interface</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> {</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">record</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Sleeping</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">int</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">hours</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">implements</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> {}</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">record</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Skiing</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">(</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">String</span><span style="font-size:10.5pt;font-family:Consolas;color:#9CDCFE">resort</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">) </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">implements</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> {}</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">record</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Coding</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">() </span><span style="font-size:10.5pt;font-family:Consolas;color:#569CD6">implements</span><span style="font-size:10.5pt;font-family:Consolas;color:#4EC9B0">Activity</span><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> {}</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4"> }</span></p><p class="xmsonormal" style="line-height:14.25pt;background:#1E1E1E"><span style="font-size:10.5pt;font-family:Consolas;color:#D4D4D4">}</span></p><p class="xmsonormal"> </p><p class="xmsonormal">This deconstruction should be exhaustive since Pair is a guaranteed match boolean doesn’t have subclasses and Activity is sealed and fully covered. </p><p class="xmsonormal">Null should throw in this case. A default case would never be reached. </p><p class="xmsonormal">(Compiling and running with (dead) default case)</p></div></div></div><br></blockquote></div></div></body></html>