groovy git commit: GROOVY-8176: tap - exception in phase 'instruction selection' (closes #535)

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

groovy git commit: GROOVY-8176: tap - exception in phase 'instruction selection' (closes #535)

paulk
Repository: groovy
Updated Branches:
  refs/heads/master e4e5bcb24 -> 7c5721d95


GROOVY-8176: tap - exception in phase 'instruction selection' (closes #535)


Project: http://git-wip-us.apache.org/repos/asf/groovy/repo
Commit: http://git-wip-us.apache.org/repos/asf/groovy/commit/7c5721d9
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/7c5721d9
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/7c5721d9

Branch: refs/heads/master
Commit: 7c5721d95abcad6bf580787ea359875eb8239e8b
Parents: e4e5bcb
Author: paulk <[hidden email]>
Authored: Fri May 5 13:36:41 2017 +1000
Committer: paulk <[hidden email]>
Committed: Sun May 7 16:32:22 2017 +1000

----------------------------------------------------------------------
 .../groovy/ast/tools/WideningCategories.java    |  6 +--
 src/test/groovy/bugs/Groovy8176Bug.groovy       | 40 ++++++++++++++++++++
 2 files changed, 43 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/groovy/blob/7c5721d9/src/main/org/codehaus/groovy/ast/tools/WideningCategories.java
----------------------------------------------------------------------
diff --git a/src/main/org/codehaus/groovy/ast/tools/WideningCategories.java b/src/main/org/codehaus/groovy/ast/tools/WideningCategories.java
index a8dcf22..6f89b60 100644
--- a/src/main/org/codehaus/groovy/ast/tools/WideningCategories.java
+++ b/src/main/org/codehaus/groovy/ast/tools/WideningCategories.java
@@ -232,9 +232,9 @@ public class WideningCategories {
         // it according to the types provided by the two class nodes
         ClassNode holderForA = findGenericsTypeHolderForClass(a, lub);
         ClassNode holderForB = findGenericsTypeHolderForClass(b, lub);
-        // lets compare their generics type
-        GenericsType[] agt = holderForA.getGenericsTypes();
-        GenericsType[] bgt = holderForB.getGenericsTypes();
+        // let's compare their generics type
+        GenericsType[] agt = holderForA == null ? null : holderForA.getGenericsTypes();
+        GenericsType[] bgt = holderForB == null ? null : holderForB.getGenericsTypes();
         if (agt==null || bgt==null || agt.length!=bgt.length) {
             return lub;
         }

http://git-wip-us.apache.org/repos/asf/groovy/blob/7c5721d9/src/test/groovy/bugs/Groovy8176Bug.groovy
----------------------------------------------------------------------
diff --git a/src/test/groovy/bugs/Groovy8176Bug.groovy b/src/test/groovy/bugs/Groovy8176Bug.groovy
new file mode 100644
index 0000000..5c52122
--- /dev/null
+++ b/src/test/groovy/bugs/Groovy8176Bug.groovy
@@ -0,0 +1,40 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package groovy.bugs
+
+class Groovy8176Bug extends GroovyTestCase {
+    void testTernaryWithTap() {
+        assertScript '''
+            import groovy.transform.CompileStatic
+
+            @CompileStatic
+            static <M extends Map> M merge(M to, Map from) {
+                !from ? to : to.tap {
+                    one = from['one']
+                    two = from['two']
+                }
+            }
+
+            def orig = [:]
+            def result = merge(orig, [one: 1, two: 2.0])
+            assert result == [one: 1, two: 2.0]
+            assert result.is(orig)
+        '''
+    }
+}