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/GROOVY_2_6_X 27c7205dd -> 0995387ed


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/0995387e
Tree: http://git-wip-us.apache.org/repos/asf/groovy/tree/0995387e
Diff: http://git-wip-us.apache.org/repos/asf/groovy/diff/0995387e

Branch: refs/heads/GROOVY_2_6_X
Commit: 0995387ed51a8f368649cf1a9a74a73dc9ec8578
Parents: 27c7205
Author: paulk <[hidden email]>
Authored: Fri May 5 13:36:41 2017 +1000
Committer: paulk <[hidden email]>
Committed: Sun May 7 16:34: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/0995387e/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/0995387e/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)
+        '''
+    }
+}