Buggy code:
} } else if ( valueIfFalseType . isBaseType ( ) ) { if ( ( valueIfFalseType == ( NullBinding ) ) == ( valueIfTrueType . isBaseType ( ) ) ) { valueIfTrueType = env . computeBoxingType ( valueIfTrueType ) ; } } } } Constant condConstant ; Constant trueConstant ; Constant falseConstant ; if ( ( ( ( condConstant = condition . constant ) != ( NotAConstant ) ) && ( ( trueConstant = valueIfTrue . constant ) != ( NotAConstant ) ) ) && ( ( falseConstant = valueIfFalse . constant ) != ( NotAConstant ) ) ) { constant = ( condConstant . booleanValue ( ) ) ? trueConstant : falseConstant ; } if ( valueIfTrueType == valueIfFalseType ) { valueIfTrue . computeConversion ( scope , valueIfTrueType , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , valueIfFalseType , originalValueIfFalseType ) ; if ( valueIfTrueType == ( BooleanBinding ) ) { this . optimizedIfTrueConstant = valueIfTrue . optimizedBooleanConstant ( ) ; this . optimizedIfFalseConstant = valueIfFalse . optimizedBooleanConstant ( ) ; if ( ( ( ( this . optimizedIfTrueConstant ) != ( NotAConstant ) ) && ( ( this . optimizedIfFalseConstant ) != ( NotAConstant ) ) ) && ( ( this . optimizedIfTrueConstant . booleanValue ( ) ) == ( this . optimizedIfFalseConstant . booleanValue ( ) ) ) ) { this . optimizedBooleanConstant = optimizedIfTrueConstant ; } else if ( ( condConstant = condition . optimizedBooleanConstant ( ) ) != ( NotAConstant ) ) { this . optimizedBooleanConstant = ( condConstant . booleanValue ( ) ) ? this . optimizedIfTrueConstant : this . optimizedIfFalseConstant ; } } return this . resolvedType = valueIfTrueType ; } if ( ( valueIfTrueType . isNumericType ( ) ) && ( valueIfFalseType . isNumericType ( ) ) ) { if ( ( ( valueIfTrueType == ( ByteBinding ) ) && ( valueIfFalseType == ( ShortBinding ) ) ) || ( ( valueIfTrueType == ( ShortBinding ) ) && ( valueIfFalseType == ( ByteBinding ) ) ) ) { valueIfTrue . computeConversion ( scope , ShortBinding , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , ShortBinding , originalValueIfFalseType ) ; return this . resolvedType = ShortBinding ; } if ( ( ( ( valueIfTrueType == ( ByteBinding ) ) || ( valueIfTrueType == ( ShortBinding ) ) ) || ( valueIfTrueType == ( CharBinding ) ) ) && ( ( valueIfFalseType == ( IntBinding ) ) && ( valueIfFalse . isConstantValueOfTypeAssignableToType ( valueIfFalseType , valueIfTrueType ) ) ) ) { valueIfTrue . computeConversion ( scope , valueIfTrueType , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , valueIfTrueType , originalValueIfFalseType ) ; return this . resolvedType = valueIfTrueType ; } if ( ( ( ( valueIfFalseType == ( ByteBinding ) ) || ( valueIfFalseType == ( ShortBinding ) ) ) || ( valueIfFalseType == ( CharBinding ) ) ) && ( ( valueIfTrueType == ( IntBinding ) ) && ( valueIfTrue . isConstantValueOfTypeAssignableToType ( valueIfTrueType , valueIfFalseType ) ) ) ) { valueIfTrue . computeConversion ( scope , valueIfFalseType , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , valueIfFalseType , originalValueIfFalseType ) ; return this . resolvedType = valueIfFalseType ; } if ( ( BaseTypeBinding . isNarrowing ( valueIfTrueType . id , TypeIds . T_int ) ) && ( BaseTypeBinding . isNarrowing ( valueIfFalseType . id , TypeIds . T_int ) ) ) { valueIfTrue . computeConversion ( scope , IntBinding , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , IntBinding , originalValueIfFalseType ) ; return this . resolvedType = IntBinding ; } if ( ( BaseTypeBinding . isNarrowing ( valueIfTrueType . id , TypeIds . T_long ) ) && ( BaseTypeBinding . isNarrowing ( valueIfFalseType . id , TypeIds . T_long ) ) ) { valueIfTrue . computeConversion ( scope , LongBinding , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , LongBinding , originalValueIfFalseType ) ; return this . resolvedType = LongBinding ; } if ( ( BaseTypeBinding . isNarrowing ( valueIfTrueType . id , TypeIds . T_float ) ) && ( BaseTypeBinding . isNarrowing ( valueIfFalseType . id , TypeIds . T_float ) ) ) { valueIfTrue . computeConversion ( scope , FloatBinding , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , FloatBinding , originalValueIfFalseType ) ; return this . resolvedType = FloatBinding ; } valueIfTrue . computeConversion ( scope , DoubleBinding , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , DoubleBinding , originalValueIfFalseType ) ; return this . resolvedType = DoubleBinding ; } if ( ( ( valueIfTrueType . isBaseType ( ) ) && ( valueIfTrueType != ( NullBinding ) ) ) || ( ( valueIfFalseType . isBaseType ( ) ) && ( valueIfFalseType != ( NullBinding ) ) ) ) { scope . problemReporter ( ) . conditionalArgumentsIncompatibleTypes ( this , valueIfTrueType , valueIfFalseType ) ; return null ; } if ( valueIfFalseType . isCompatibleWith ( valueIfTrueType ) ) { valueIfTrue . computeConversion ( scope , valueIfTrueType , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , valueIfTrueType , originalValueIfFalseType ) ; return this . resolvedType = valueIfTrueType ; } if ( valueIfTrueType . isCompatibleWith ( valueIfFalseType ) ) { valueIfTrue . computeConversion ( scope , valueIfFalseType , originalValueIfTrueType ) ; valueIfFalse . computeConversion ( scope , valueIfFalseType , originalValueIfFalseType ) ; return this . resolvedType = valueIfFalseType ; } if ( use15specifics ) { TypeBinding commonType = scope . lowerUpperBound ( new TypeBinding [ ] { valueIfTrueType , valueIfFalseType } ) ; if ( commonType != null ) { valueIfTrue . computeConversion ( scope , commonType , valueIfTrueType ) ; valueIfFalse . computeConversion ( scope , commonType , valueIfFalseType ) ; <START_BUG> return this . resolvedType = commonType ; <END_BUG> } } scope . problemReporter ( ) . conditionalArgumentsIncompatibleTypes ( this , valueIfTrueType , valueIfFalseType ) ; return null ; } public void traverse ( ASTVisitor visitor , BlockScope scope ) { } }

Fix:
return this . resolvedType = commonType . capture ( ) ;