This is an automated email from the ASF dual-hosted git repository.

emilles pushed a commit to branch GROOVY_4_0_X
in repository https://gitbox.apache.org/repos/asf/groovy.git


The following commit(s) were added to refs/heads/GROOVY_4_0_X by this push:
     new 24242d4478 GROOVY-11358: STC: cannot access private field of abstract 
class outside
24242d4478 is described below

commit 24242d4478db307b4f795aa4ef420847b46b316d
Author: Eric Milles <eric.mil...@thomsonreuters.com>
AuthorDate: Wed Apr 10 09:05:54 2024 -0500

    GROOVY-11358: STC: cannot access private field of abstract class outside
---
 .../transform/stc/StaticTypeCheckingVisitor.java   |  2 +-
 .../stc/FieldsAndPropertiesSTCTest.groovy          | 27 ++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
index bc461f4cb4..20d3b885a2 100644
--- 
a/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
+++ 
b/src/main/java/org/codehaus/groovy/transform/stc/StaticTypeCheckingVisitor.java
@@ -1825,7 +1825,7 @@ public class StaticTypeCheckingVisitor extends 
ClassCodeVisitorSupport {
         if (visitor != null) visitor.visitField(field);
         checkOrMarkPrivateAccess(expressionToStoreOn, field, lhsOfAssignment);
         boolean superField = 
isSuperExpression(expressionToStoreOn.getObjectExpression());
-        boolean accessible = ( !superField && 
receiver.equals(field.getDeclaringClass()) ) // GROOVY-7300
+        boolean accessible = (!superField && 
receiver.equals(field.getDeclaringClass()) && 
!field.getDeclaringClass().isAbstract()) // GROOVY-7300, GROOVY-11358
                 || 
hasAccessToMember(typeCheckingContext.getEnclosingClassNode(), 
field.getDeclaringClass(), field.getModifiers());
 
         if (!accessible) {
diff --git a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy 
b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
index 64f72f40dd..fd1aafc48a 100644
--- a/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
+++ b/src/test/groovy/transform/stc/FieldsAndPropertiesSTCTest.groovy
@@ -969,6 +969,33 @@ class FieldsAndPropertiesSTCTest extends 
StaticTypeCheckingTestCase {
         '''
     }
 
+    // GROOVY-11358
+    void testPrivateFieldAccessOfAbstract() {
+        shouldFailWithMessages '''
+            abstract class A {
+                private int f
+            }
+            void test(A a) {
+                int i = a.@f // MissingFieldException
+                int j = a.f  // MissingPropertyException
+            }
+            test(new A() {})
+        ''',
+        'Cannot access field: f of class: A', 'No such property: f for class: 
A'
+
+        shouldFailWithMessages '''
+            abstract class A {
+                private int f
+            }
+            void test(A a) {
+                a.@f = 1 // MissingFieldException
+                a.f  = 2 // MissingPropertyException
+            }
+            test(new A() {})
+        ''',
+        'Cannot access field: f of class: A', 'No such property: f for class: 
A'
+    }
+
     // GROOVY-5737
     void testGeneratedFieldAccessInClosure() {
         assertScript '''

Reply via email to