SUGGESTED FIX
# HG changeset patch
# User darcy
# Date 1312481737 25200
# Node ID 64b9b7ae33667807e34e17a8e017e9d4adb43c33
# Parent 0d6d41563040e1fa91180cf0a54165bdb2b78827
7071246: Enclosing string literal in parenthesis in switch-case crashes javac
Reviewed-by: mcimadamore
--- a/src/share/classes/com/sun/tools/javac/comp/Lower.java Wed Jul 27 11:53:17 2011 -0700
+++ b/src/share/classes/com/sun/tools/javac/comp/Lower.java Thu Aug 04 11:15:37 2011 -0700
@@ -3450,6 +3450,7 @@ public class Lower extends TreeTranslato
JCExpression expression = oneCase.getExpression();
if (expression != null) { // expression for a "default" case is null
+ expression = TreeInfo.skipParens(expression);
String labelExpr = (String) expression.type.constValue();
Integer mapping = caseLabelToPosition.put(labelExpr, casePosition);
Assert.checkNull(mapping);
@@ -3555,8 +3556,8 @@ public class Lower extends TreeTranslato
if (isDefault)
caseExpr = null;
else {
- caseExpr = make.Literal(caseLabelToPosition.get((String)oneCase.
- getExpression().
+ caseExpr = make.Literal(caseLabelToPosition.get((String)TreeInfo.skipParens(oneCase.
+ getExpression()).
type.constValue()));
}
--- a/test/tools/javac/StringsInSwitch/StringSwitches.java Wed Jul 27 11:53:17 2011 -0700
+++ b/test/tools/javac/StringsInSwitch/StringSwitches.java Thu Aug 04 11:15:37 2011 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2011 Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
/*
* @test
- * @bug 6827009
+ * @bug 6827009 7071246
* @summary Positive tests for strings in switch.
* @author Joseph D. Darcy
*/
@@ -36,6 +36,7 @@ public class StringSwitches {
failures += testPileup();
failures += testSwitchingTwoWays();
failures += testNamedBreak();
+ failures += testExtraParens();
if (failures > 0) {
throw new RuntimeException();
@@ -260,4 +261,19 @@ public class StringSwitches {
result |= (1<<5);
return result;
}
+
+ private static int testExtraParens() {
+ int failures = 1;
+ String s = "first";
+
+ switch(s) {
+ case (("first")):
+ failures = 0;
+ break;
+ case ("second"):
+ throw new RuntimeException("Should not be reached.");
+ }
+
+ return failures;
+ }
}
|