From 6f911d22f58efad56fbf45985f958b3ad1fa81e4 Mon Sep 17 00:00:00 2001 From: Michael Ernst Date: Mon, 10 Aug 2026 06:08:15 -0700 Subject: [PATCH] Update `checker-qual.jar` --- checker-qual.jar | Bin 277069 -> 278808 bytes .../checker/builder/qual/CalledMethods.java | 2 +- .../formatter/qual/ConversionCategory.java | 38 +++++++++++------- .../checker/formatter/qual/FormatBottom.java | 2 +- .../qual/I18nConversionCategory.java | 15 ++++--- .../i18nformatter/qual/I18nFormatBottom.java | 2 +- .../checker/index/qual/IndexOrHigh.java | 7 +++- .../checker/index/qual/LengthOf.java | 2 +- .../interning/qual/InternedDistinct.java | 2 +- .../nonempty/qual/EnsuresNonEmptyIf.java | 2 +- .../optional/qual/RequiresPresent.java | 2 +- .../checker/regex/qual/RegexBottom.java | 2 +- .../checker/signature/qual/BinaryName.java | 2 +- .../checker/signature/qual/CanonicalName.java | 4 +- .../signature/qual/FullyQualifiedName.java | 2 +- .../sqlquotes/qual/SqlQuotesBottom.java | 2 +- .../common/aliasing/qual/NonLeaked.java | 2 +- .../common/reflection/qual/ClassBound.java | 2 +- .../common/reflection/qual/ClassVal.java | 2 +- .../common/reflection/qual/MethodVal.java | 2 +- .../returnsreceiver/qual/UnknownThis.java | 2 +- .../checkerframework/dataflow/qual/Pure.java | 11 +---- .../dataflow/qual/SideEffectFree.java | 4 +- .../dataflow/qual/SideEffectsOnly.java | 32 ++++++++++++--- .../ConditionalPostconditionAnnotation.java | 5 ++- .../qual/DoesNotUnrefineReceiver.java | 3 +- 26 files changed, 91 insertions(+), 60 deletions(-) diff --git a/checker-qual.jar b/checker-qual.jar index 6fd66597188d621f30bb388aef2e1dfd026c1652..1f4c88a8511fcf976ab49118f2ccdd60c8cd7a23 100644 GIT binary patch delta 28656 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 DYXaj< delta 26858 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 diff --git a/src/java.base/share/classes/org/checkerframework/checker/builder/qual/CalledMethods.java b/src/java.base/share/classes/org/checkerframework/checker/builder/qual/CalledMethods.java index 8ae314c7fcdb..bc457c6a7979 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/builder/qual/CalledMethods.java +++ b/src/java.base/share/classes/org/checkerframework/checker/builder/qual/CalledMethods.java @@ -21,7 +21,7 @@ /** * The names of methods that have definitely been called. * - * @return the names of methods that have definetely been called + * @return the names of methods that have definitely been called */ String[] value(); } diff --git a/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/ConversionCategory.java b/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/ConversionCategory.java index 07c28dc621ce..9d76da93e24e 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/ConversionCategory.java +++ b/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/ConversionCategory.java @@ -96,7 +96,7 @@ public enum ConversionCategory { /** * Use if no object of any type can be passed as parameter. In this case, the only legal value is - * null. This is seldomly needed, and indicates an error in most cases. For example: + * null. This is seldom needed, and indicates an error in most cases. For example: * *
    *   format("Test %1$f %1$d", null);
@@ -107,8 +107,8 @@ public enum ConversionCategory {
   NULL(null),
 
   /**
-   * Use if a parameter is not used by the formatter. This is seldomly needed, and indicates an
-   * error in most cases. For example:
+   * Use if a parameter is not used by the formatter. This is seldom needed, and indicates an error
+   * in most cases. For example:
    *
    * 
    *   format("Test %1$s %3$s", "a","unused","b");
@@ -187,8 +187,9 @@ public enum ConversionCategory {
    * The conversion categories that have a corresponding conversion character. This lacks UNUSED,
    * TIME_AND_INT, etc.
    */
-  private static final ConversionCategory[] conversionCategoriesWithChar =
-      new ConversionCategory[] {GENERAL, CHAR, INT, FLOAT, TIME};
+  private static final ConversionCategory[] conversionCategoriesWithChar = {
+    GENERAL, CHAR, INT, FLOAT, TIME
+  };
 
   /**
    * Converts a conversion character to a category. For example:
@@ -210,6 +211,13 @@ public static ConversionCategory fromConversionChar(char c) {
     throw new IllegalArgumentException("Bad conversion character " + c);
   }
 
+  /**
+   * Converts an array to a set.
+   *
+   * @param a an array
+   * @param  the type of array and set elements
+   * @return a set containing the array's elements
+   */
   private static  Set arrayToSet(E[] a) {
     return new HashSet<>(Arrays.asList(a));
   }
@@ -219,11 +227,12 @@ public static boolean isSubsetOf(ConversionCategory a, ConversionCategory b) {
   }
 
   /** Conversion categories that need to be considered by {@link #intersect}. */
-  private static final ConversionCategory[] conversionCategoriesForIntersect =
-      new ConversionCategory[] {CHAR, INT, FLOAT, TIME, CHAR_AND_INT, INT_AND_TIME, NULL};
+  private static final ConversionCategory[] conversionCategoriesForIntersect = {
+    CHAR, INT, FLOAT, TIME, CHAR_AND_INT, INT_AND_TIME, NULL
+  };
 
   /**
-   * Returns the intersection of two categories. This is seldomly needed.
+   * Returns the intersection of two categories. This is seldom needed.
    *
    * 
* @@ -266,15 +275,16 @@ public static ConversionCategory intersect(ConversionCategory a, ConversionCateg return v; } } - throw new RuntimeException(); + throw new RuntimeException("Could not compute intersect(" + a + ", " + b + ")"); } /** Conversion categories that need to be considered by {@link #union}. */ - private static final ConversionCategory[] conversionCategoriesForUnion = - new ConversionCategory[] {NULL, CHAR_AND_INT, INT_AND_TIME, CHAR, INT, FLOAT, TIME}; + private static final ConversionCategory[] conversionCategoriesForUnion = { + NULL, CHAR_AND_INT, INT_AND_TIME, CHAR, INT, FLOAT, TIME + }; /** - * Returns the union of two categories. This is seldomly needed. + * Returns the union of two categories. This is seldom needed. * *
* @@ -346,7 +356,7 @@ public boolean isAssignableFrom(Class argType) { @Pure @Override public String toString() { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(32); sb.append(name()); sb.append(" conversion category"); @@ -358,7 +368,7 @@ public String toString() { for (Class cls : types) { sj.add(cls.getSimpleName()); } - sb.append(" "); + sb.append(' '); sb.append(sj); return sb.toString(); diff --git a/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/FormatBottom.java b/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/FormatBottom.java index 9ce0ec040f52..87263ecb9b04 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/FormatBottom.java +++ b/src/java.base/share/classes/org/checkerframework/checker/formatter/qual/FormatBottom.java @@ -21,5 +21,5 @@ @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @TargetLocations({TypeUseLocation.EXPLICIT_LOWER_BOUND, TypeUseLocation.EXPLICIT_UPPER_BOUND}) @SubtypeOf({Format.class, InvalidFormat.class}) -@DefaultFor(value = {TypeUseLocation.LOWER_BOUND}) +@DefaultFor({TypeUseLocation.LOWER_BOUND}) public @interface FormatBottom {} diff --git a/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nConversionCategory.java b/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nConversionCategory.java index 0438bbfdf3cc..3d99894418eb 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nConversionCategory.java +++ b/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nConversionCategory.java @@ -64,8 +64,7 @@ public enum I18nConversionCategory { } /** Used by {@link #stringToI18nConversionCategory}. */ - private static final I18nConversionCategory[] namedCategories = - new I18nConversionCategory[] {DATE, NUMBER}; + private static final I18nConversionCategory[] namedCategories = {DATE, NUMBER}; /** * Creates a conversion cagetogry from a string name. @@ -90,6 +89,13 @@ public static I18nConversionCategory stringToI18nConversionCategory(String strin throw new IllegalArgumentException("Invalid format type " + string); } + /** + * Converts an array to a set. + * + * @param a an array + * @param the type of array and set elements + * @return a set containing the array's elements + */ private static Set arrayToSet(E[] a) { return new HashSet<>(Arrays.asList(a)); } @@ -104,8 +110,7 @@ public static boolean isSubsetOf(I18nConversionCategory a, I18nConversionCategor } /** Conversion categories that need to be considered by {@link #intersect}. */ - private static final I18nConversionCategory[] conversionCategoriesForIntersect = - new I18nConversionCategory[] {DATE, NUMBER}; + private static final I18nConversionCategory[] conversionCategoriesForIntersect = {DATE, NUMBER}; /** * Returns the intersection of the two given I18nConversionCategories. @@ -147,7 +152,7 @@ public static I18nConversionCategory intersect( return v; } } - throw new RuntimeException(); + throw new RuntimeException("Could not compute intersect(" + a + ", " + b + ")"); } /** diff --git a/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nFormatBottom.java b/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nFormatBottom.java index 44637a30b819..941f4e61d7cd 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nFormatBottom.java +++ b/src/java.base/share/classes/org/checkerframework/checker/i18nformatter/qual/I18nFormatBottom.java @@ -22,5 +22,5 @@ @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) @TargetLocations({TypeUseLocation.EXPLICIT_LOWER_BOUND, TypeUseLocation.EXPLICIT_UPPER_BOUND}) @SubtypeOf({I18nFormat.class, I18nInvalidFormat.class, I18nFormatFor.class}) -@DefaultFor(value = {TypeUseLocation.LOWER_BOUND}) +@DefaultFor({TypeUseLocation.LOWER_BOUND}) public @interface I18nFormatBottom {} diff --git a/src/java.base/share/classes/org/checkerframework/checker/index/qual/IndexOrHigh.java b/src/java.base/share/classes/org/checkerframework/checker/index/qual/IndexOrHigh.java index 11990235099e..3fecd1d288b1 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/index/qual/IndexOrHigh.java +++ b/src/java.base/share/classes/org/checkerframework/checker/index/qual/IndexOrHigh.java @@ -33,6 +33,11 @@ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER}) public @interface IndexOrHigh { - /** The annotated expression is a valid index for, or is equal to the length of, each sequence. */ + /** + * The annotated expression is a valid index for, or is equal to the length of, each sequence. + * + * @return sequences that the annotated expression is a valid index for or is equal to the length + * of + */ String[] value(); } diff --git a/src/java.base/share/classes/org/checkerframework/checker/index/qual/LengthOf.java b/src/java.base/share/classes/org/checkerframework/checker/index/qual/LengthOf.java index 53adb1af1d4a..980d9796c8a0 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/index/qual/LengthOf.java +++ b/src/java.base/share/classes/org/checkerframework/checker/index/qual/LengthOf.java @@ -13,7 +13,7 @@ * detail that may change in the future, when this type may be used to implement more precise * refinements. * - *

The usual use case for the {@code LengthOf} annotation is in the defintions of custom + *

The usual use case for the {@code LengthOf} annotation is in the definitions of custom * collections. Consider the signature of java.lang.String#length(): * *

diff --git a/src/java.base/share/classes/org/checkerframework/checker/interning/qual/InternedDistinct.java b/src/java.base/share/classes/org/checkerframework/checker/interning/qual/InternedDistinct.java
index c1e7fb54a8cb..80b80e37cfaf 100644
--- a/src/java.base/share/classes/org/checkerframework/checker/interning/qual/InternedDistinct.java
+++ b/src/java.base/share/classes/org/checkerframework/checker/interning/qual/InternedDistinct.java
@@ -25,5 +25,5 @@
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
 @SubtypeOf(Interned.class)
-@DefaultFor(value = {TypeUseLocation.LOWER_BOUND})
+@DefaultFor({TypeUseLocation.LOWER_BOUND})
 public @interface InternedDistinct {}
diff --git a/src/java.base/share/classes/org/checkerframework/checker/nonempty/qual/EnsuresNonEmptyIf.java b/src/java.base/share/classes/org/checkerframework/checker/nonempty/qual/EnsuresNonEmptyIf.java
index af97ce2509f8..56be2b326f4d 100644
--- a/src/java.base/share/classes/org/checkerframework/checker/nonempty/qual/EnsuresNonEmptyIf.java
+++ b/src/java.base/share/classes/org/checkerframework/checker/nonempty/qual/EnsuresNonEmptyIf.java
@@ -71,7 +71,7 @@
   /**
    * A wrapper annotation that makes the {@link EnsuresNonEmptyIf} annotation repeatable.
    *
-   * 

Programmers generally do not need to write ths. It is created by Java when a programmer + *

Programmers generally do not need to write this. It is created by Java when a programmer * writes more than one {@link EnsuresNonEmptyIf} annotation at the same location. */ @Retention(RetentionPolicy.RUNTIME) diff --git a/src/java.base/share/classes/org/checkerframework/checker/optional/qual/RequiresPresent.java b/src/java.base/share/classes/org/checkerframework/checker/optional/qual/RequiresPresent.java index d8754d3beacb..1ad847e9e0ae 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/optional/qual/RequiresPresent.java +++ b/src/java.base/share/classes/org/checkerframework/checker/optional/qual/RequiresPresent.java @@ -63,7 +63,7 @@ public @interface RequiresPresent { /** - * The Java expressions that that need to be {@link Present}. + * The Java expressions that need to be {@link Present}. * * @return the Java expressions that need to be {@link Present} * @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions diff --git a/src/java.base/share/classes/org/checkerframework/checker/regex/qual/RegexBottom.java b/src/java.base/share/classes/org/checkerframework/checker/regex/qual/RegexBottom.java index 2ffcb62ad718..b948170765bd 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/regex/qual/RegexBottom.java +++ b/src/java.base/share/classes/org/checkerframework/checker/regex/qual/RegexBottom.java @@ -23,5 +23,5 @@ @TargetLocations({TypeUseLocation.EXPLICIT_LOWER_BOUND, TypeUseLocation.EXPLICIT_UPPER_BOUND}) @InvisibleQualifier @SubtypeOf({Regex.class, PartialRegex.class}) -@DefaultFor(value = {TypeUseLocation.LOWER_BOUND}) +@DefaultFor({TypeUseLocation.LOWER_BOUND}) public @interface RegexBottom {} diff --git a/src/java.base/share/classes/org/checkerframework/checker/signature/qual/BinaryName.java b/src/java.base/share/classes/org/checkerframework/checker/signature/qual/BinaryName.java index c178d9371fff..72e3272bdc50 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/signature/qual/BinaryName.java +++ b/src/java.base/share/classes/org/checkerframework/checker/signature/qual/BinaryName.java @@ -9,7 +9,7 @@ /** * Represents a binary name as defined in the Java Language + * href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-13.html#jls-13.1">Java Language * Specification, section 13.1. * *

For example, in diff --git a/src/java.base/share/classes/org/checkerframework/checker/signature/qual/CanonicalName.java b/src/java.base/share/classes/org/checkerframework/checker/signature/qual/CanonicalName.java index b22307594d81..946f216518d2 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/signature/qual/CanonicalName.java +++ b/src/java.base/share/classes/org/checkerframework/checker/signature/qual/CanonicalName.java @@ -12,11 +12,10 @@ * Every canonical name is a fully-qualified name, but not every fully-qualified name is a canonical * name. * - *

JLS section + *

JLS section * 6.7 gives the following example: * *

- * * The difference between a fully qualified name and a canonical name can be seen in code such as: * *
{@code
@@ -27,7 +26,6 @@
  *
  * Both {@code p.O1.I} and {@code p.O2.I} are fully qualified names that denote the member class
  * {@code I}, but only {@code p.O1.I} is its canonical name.
- *
  * 
* * Given a character sequence that is a fully-qualified name, there is no way to know whether or not diff --git a/src/java.base/share/classes/org/checkerframework/checker/signature/qual/FullyQualifiedName.java b/src/java.base/share/classes/org/checkerframework/checker/signature/qual/FullyQualifiedName.java index 9ed69097a969..6d2fcd7b7c5c 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/signature/qual/FullyQualifiedName.java +++ b/src/java.base/share/classes/org/checkerframework/checker/signature/qual/FullyQualifiedName.java @@ -10,7 +10,7 @@ /** * A sequence of dot-separated identifiers, followed by any number of array square brackets. * Represents a fully-qualified name as defined in the Java Language + * href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-6.html#jls-6.7">Java Language * Specification, section 6.7. * *

Examples: diff --git a/src/java.base/share/classes/org/checkerframework/checker/sqlquotes/qual/SqlQuotesBottom.java b/src/java.base/share/classes/org/checkerframework/checker/sqlquotes/qual/SqlQuotesBottom.java index 41acaca1641d..542f2a288119 100644 --- a/src/java.base/share/classes/org/checkerframework/checker/sqlquotes/qual/SqlQuotesBottom.java +++ b/src/java.base/share/classes/org/checkerframework/checker/sqlquotes/qual/SqlQuotesBottom.java @@ -23,5 +23,5 @@ @TargetLocations({TypeUseLocation.EXPLICIT_LOWER_BOUND, TypeUseLocation.EXPLICIT_UPPER_BOUND}) @InvisibleQualifier @SubtypeOf({SqlEvenQuotes.class, SqlOddQuotes.class}) -@DefaultFor(value = {TypeUseLocation.LOWER_BOUND}) +@DefaultFor({TypeUseLocation.LOWER_BOUND}) public @interface SqlQuotesBottom {} diff --git a/src/java.base/share/classes/org/checkerframework/common/aliasing/qual/NonLeaked.java b/src/java.base/share/classes/org/checkerframework/common/aliasing/qual/NonLeaked.java index ad0b07366d57..5686d79b5b3d 100644 --- a/src/java.base/share/classes/org/checkerframework/common/aliasing/qual/NonLeaked.java +++ b/src/java.base/share/classes/org/checkerframework/common/aliasing/qual/NonLeaked.java @@ -21,7 +21,7 @@ */ // This is a type qualifier because of a Checker Framework limitation (Issue 383), but its hierarchy -// is ignored. Once the stub parser gets updated to read non-type-qualifiers annotations on stub +// is ignored. Once the stub parser gets updated to store non-type-qualifier annotations from stub // files, this annotation won't be a type qualifier anymore. @Documented diff --git a/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassBound.java b/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassBound.java index 0cae3ff79e33..45bf1d9b9740 100644 --- a/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassBound.java +++ b/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassBound.java @@ -19,7 +19,7 @@ @SubtypeOf({UnknownClass.class}) public @interface ClassBound { /** - * The binary + * The binary * name of the class or classes that upper-bound the values of this Class object. */ String[] value(); diff --git a/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassVal.java b/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassVal.java index 424efe40bb8f..a6d22b0bc4ce 100644 --- a/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassVal.java +++ b/src/java.base/share/classes/org/checkerframework/common/reflection/qual/ClassVal.java @@ -22,7 +22,7 @@ /** * The name of the type that this Class object represents. The name is a "fully-qualified binary * name" ({@link org.checkerframework.checker.signature.qual.FqBinaryName}): a primitive or binary name, + * href="https://docs.oracle.com/javase/specs/jls/se25/html/jls-13.html#jls-13.1">binary name, * possibly followed by some number of array brackets. * * @return the name of the type that this Class object represents diff --git a/src/java.base/share/classes/org/checkerframework/common/reflection/qual/MethodVal.java b/src/java.base/share/classes/org/checkerframework/common/reflection/qual/MethodVal.java index 3c7612321b0c..792119ad09e7 100644 --- a/src/java.base/share/classes/org/checkerframework/common/reflection/qual/MethodVal.java +++ b/src/java.base/share/classes/org/checkerframework/common/reflection/qual/MethodVal.java @@ -24,7 +24,7 @@ @SubtypeOf({UnknownMethod.class}) public @interface MethodVal { /** - * The binary + * The binary * name of the class that declares this method. */ String[] className(); diff --git a/src/java.base/share/classes/org/checkerframework/common/returnsreceiver/qual/UnknownThis.java b/src/java.base/share/classes/org/checkerframework/common/returnsreceiver/qual/UnknownThis.java index 7ada21419f1e..70b38d5de7c1 100644 --- a/src/java.base/share/classes/org/checkerframework/common/returnsreceiver/qual/UnknownThis.java +++ b/src/java.base/share/classes/org/checkerframework/common/returnsreceiver/qual/UnknownThis.java @@ -23,6 +23,6 @@ @SubtypeOf({}) @DefaultQualifierInHierarchy @QualifierForLiterals(LiteralKind.NULL) -@DefaultFor(value = TypeUseLocation.LOWER_BOUND) +@DefaultFor(TypeUseLocation.LOWER_BOUND) @InvisibleQualifier public @interface UnknownThis {} diff --git a/src/java.base/share/classes/org/checkerframework/dataflow/qual/Pure.java b/src/java.base/share/classes/org/checkerframework/dataflow/qual/Pure.java index 82cdb5968795..3409465840f4 100644 --- a/src/java.base/share/classes/org/checkerframework/dataflow/qual/Pure.java +++ b/src/java.base/share/classes/org/checkerframework/dataflow/qual/Pure.java @@ -25,13 +25,4 @@ @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) -public @interface Pure { - /** The type of purity. */ - public static enum Kind { - /** The method has no visible side effects. */ - SIDE_EFFECT_FREE, - - /** The method returns exactly the same value when called in the same environment. */ - DETERMINISTIC - } -} +public @interface Pure {} diff --git a/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectFree.java b/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectFree.java index da33d80443e7..db55f24f792b 100644 --- a/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectFree.java +++ b/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectFree.java @@ -12,8 +12,8 @@ * *

Only the visible side effects are important. The method is allowed to cache the answer to a * computationally expensive query, for instance. It is also allowed to modify newly-created - * objects, and a constructor is side-effect-free if it does not modify any objects that existed - * before it was called. + * objects. A constructor is side-effect-free if it does not modify any objects that existed before + * it was called in ways that are externally visible. * *

This annotation is important to pluggable type-checking because if some fact about an object * is known before a call to such a method, then the fact is still known afterwards, even if the diff --git a/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectsOnly.java b/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectsOnly.java index ab6a7dd1718f..cb06cb25f51d 100644 --- a/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectsOnly.java +++ b/src/java.base/share/classes/org/checkerframework/dataflow/qual/SideEffectsOnly.java @@ -8,12 +8,27 @@ import org.checkerframework.framework.qual.JavaExpression; /** - * A method annotated with the declaration annotation {@code @SideEffectsOnly("A", "B")} changes the - * value of at most the expressions A and B. All other expressions have the same value before and - * after a call to the method. + * A method annotated with the declaration annotation {@code @SideEffectsOnly({"A", "B"})} changes + * the value of at most the expressions A and B. No other expression is directly modified by the + * method. Absent aliasing, no other expression has a different value after a call to the method. + * But checking of this annotation (under {@code -AcheckPurityAnnotations}) treats two expressions + * as possibly aliased only when an assignment relating them appears in the method body. * - * @checker_framework.manual #type-refinement-purity Specifying side effects + *

This annotation is inherited by subtypes, just as if it were meta-annotated with + * {@code @InheritedAnnotation}. + * + *

On a constructor, this annotation constrains what the constructor modifies besides the object + * being constructed. Assigning to the new object's own fields is always permitted and need not be + * listed, because the object did not exist before the call; writing {@code this} in the annotation + * is legal but has no additional effect. At a {@code new} expression, the expressions that are + * reached through {@code this} are ignored, because the object being constructed did not exist + * before the call. A constructor's annotation does not yet affect type refinement at {@code new} + * expressions. + * + * @checker_framework.manual #side-effects-only-checking Checking {@code @SideEffectsOnly} */ +// @InheritedAnnotation cannot be written here, because "dataflow" project cannot depend on +// "framework" project. @Documented @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.METHOD, ElementType.CONSTRUCTOR}) @@ -21,9 +36,16 @@ /** * An upper bound on the expressions that this method might change the value of. * + *

Each expression must denote the same location every time it is evaluated: it must be a + * variable, a field access, an array access, a literal, a class name, or a call to a {@link Pure} + * method, recursively. A {@code @Pure} method returns the same value every time it is called with + * the same arguments, so a call to one qualifies so long as its receiver and its arguments do. An + * expression such as {@code "#1.getList()"}, where {@code getList} is not {@code @Pure}, may + * denote a different value each time it is evaluated, so no method body could satisfy it. + * * @return the Java expressions that the annotated method might side-effect * @checker_framework.manual #java-expressions-as-arguments Syntax of Java expressions */ @JavaExpression - public String[] value(); + String[] value(); } diff --git a/src/java.base/share/classes/org/checkerframework/framework/qual/ConditionalPostconditionAnnotation.java b/src/java.base/share/classes/org/checkerframework/framework/qual/ConditionalPostconditionAnnotation.java index 9b7feb69237b..0a158a141c1f 100644 --- a/src/java.base/share/classes/org/checkerframework/framework/qual/ConditionalPostconditionAnnotation.java +++ b/src/java.base/share/classes/org/checkerframework/framework/qual/ConditionalPostconditionAnnotation.java @@ -37,11 +37,12 @@ *


  * {@literal @}ConditionalPostconditionAnnotation(qualifier = MinLen.class)
  * {@literal @}Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
- * public {@literal @}interface EnsuresMinLen {
+ * public {@literal @}interface EnsuresMinLenIf {
  *   String[] expression();
  *   boolean result();
  *   {@literal @}QualifierArgument("value")
  *   int targetValue() default 0;
+ * }
  * 
* * The {@code expression} element holds the expressions to which the qualifier applies and {@code @@ -52,7 +53,7 @@ * {@code @MinLen(4)} upon returning {@code true}. * *

- * {@literal @}EnsuresMinLenIf(expression = "field", result = true, targetValue = 4")
+ * {@literal @}EnsuresMinLenIf(expression = "field", result = true, targetValue = 4)
  * public boolean isFieldBool() {
  *   return field == "true" || field == "false";
  * }
diff --git a/src/java.base/share/classes/org/checkerframework/framework/qual/DoesNotUnrefineReceiver.java b/src/java.base/share/classes/org/checkerframework/framework/qual/DoesNotUnrefineReceiver.java
index 4eca89c86484..33e94710d019 100644
--- a/src/java.base/share/classes/org/checkerframework/framework/qual/DoesNotUnrefineReceiver.java
+++ b/src/java.base/share/classes/org/checkerframework/framework/qual/DoesNotUnrefineReceiver.java
@@ -15,9 +15,8 @@
  * @checker_framework.manual #type-refinement-purity Side effects, determinism, purity, and
  *     flow-sensitive analysis
  */
-// @InheritedAnnotation cannot be written here, because "dataflow" project cannot depend on
-// "framework" project.
 @Documented
+@InheritedAnnotation
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.METHOD, ElementType.CONSTRUCTOR})
 public @interface DoesNotUnrefineReceiver {