Fix: Report unboxing.of.nullable in conditional expressions with primitive result#7433
Fix: Report unboxing.of.nullable in conditional expressions with primitive result#7433Suvrat1629 wants to merge 2 commits intotypetools:masterfrom
Conversation
📝 WalkthroughWalkthroughvisitConditionalExpression in NullnessVisitor was updated to perform unboxing-aware nullness checks (UNBOXING_OF_NULLABLE) on the true/false operands when the conditional expression has a primitive overall type but one or both operands are reference types. If an unboxing check reports a nullness issue for an operand, the method returns early to avoid cascading errors; otherwise it continues existing flow. A new test Issue6849.java was added to exercise a ternary expression that previously missed an unboxing-of-nullable error. Possibly related PRs
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✨ Finishing touches
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro 📒 Files selected for processing (2)
🧰 Additional context used🧠 Learnings (2)📓 Common learnings📚 Learning: 2025-10-22T20:40:48.819ZApplied to files:
🔇 Additional comments (2)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro
📒 Files selected for processing (2)
checker/src/main/java/org/checkerframework/checker/nullness/NullnessVisitor.javachecker/tests/nullness/Issue6849.java
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: kelloggm
Repo: typetools/checker-framework PR: 7166
File: checker/src/main/java/org/checkerframework/checker/mustcall/MustCallVisitor.java:470-515
Timestamp: 2025-10-22T20:40:48.819Z
Learning: In MustCallVisitor.java (Checker Framework), prefer using Name.equals(...) or Objects.equals(...) for com.sun.source.util.Name comparisons (instead of ==/!=). This should be the default unless the Interning Checker is explicitly used to guarantee reference equality.
📚 Learning: 2025-10-22T20:40:48.819Z
Learnt from: kelloggm
Repo: typetools/checker-framework PR: 7166
File: checker/src/main/java/org/checkerframework/checker/mustcall/MustCallVisitor.java:470-515
Timestamp: 2025-10-22T20:40:48.819Z
Learning: In MustCallVisitor.java (Checker Framework), prefer using Name.equals(...) or Objects.equals(...) for com.sun.source.util.Name comparisons (instead of ==/!=). This should be the default unless the Interning Checker is explicitly used to guarantee reference equality.
Applied to files:
checker/src/main/java/org/checkerframework/checker/nullness/NullnessVisitor.java
🧬 Code graph analysis (1)
checker/src/main/java/org/checkerframework/checker/nullness/NullnessVisitor.java (1)
javacutil/src/main/java/org/checkerframework/javacutil/TypesUtils.java (1)
TypesUtils(55-1555)
🔇 Additional comments (13)
checker/src/main/java/org/checkerframework/checker/nullness/NullnessVisitor.java (12)
71-72: Formatting-only change — no functional impact.
144-146: Formatting-only change — no functional impact.
157-163: Formatting-only change — no functional impact.
192-196: Formatting-only change — no functional impact.
221-226: Formatting-only change — no functional impact.
394-400: Formatting-only change — no functional impact.
442-444: Formatting-only change — no functional impact.
571-571: Formatting-only change — no functional impact.
699-701: Formatting-only change — no functional impact.
825-836: Formatting-only change — no functional impact.
841-842: Formatting-only change — no functional impact.
787-816: Logic correctly detects unboxing in conditional expressions, verified by existing tests.The implementation properly:
- Checks if the overall conditional result type is primitive
- Identifies operands that need unboxing (reference types being assigned to primitive)
- Reports
unboxing.of.nullablewhen nullable references would be unboxed- Returns early after reporting an error to avoid cascading errors (consistent with
visitTypeCastpattern)The new logic is exercised by existing tests in
Issue6849.javaandIssue3614.java, which verify that unboxing errors are correctly reported in conditional expressions (e.g.,int y = ((true) ? method() : 10)when method returns@Nullable Integer).When both operands need unboxing and both are nullable, only the first error is reported due to the early return. This is acceptable—the cascading error prevention is intentional, though users would need to re-run after fixing the first issue to see subsequent errors.
checker/tests/nullness/Issue6849.java (1)
6-8: Consider adding@Nullableannotation to the return type for explicitness.The method
mreturnsT, which when instantiated as@Nullable Integercorrectly returns a nullable value. The current implementation is correct, but you might consider whether adding a test case that explicitly shows the return type could help document the behavior.
@Nullableboxed value in a ternary expression with primitive result type was unboxed without warning.NullnessVisitor.visitConditionalExpressionto detect whenjavacperforms unboxing conversion on one or both operands.Issue6849.java.Closes #6849