Skip to content

Invalid ParadoxicalCondition raised with nested conditions in if statement #6683

@driehle

Description

@driehle

The following code raises two ParadoxicalCondition errors:

$isImmutable = substr($typeOfField, -9) === 'immutable';

if (
    ($isImmutable && $value instanceof DateTimeImmutable)
    || (! $isImmutable && $value instanceof DateTime)
) {
    return $value;
} elseif ($isImmutable && $value instanceof DateTime) {
    return DateTimeImmutable::createFromMutable($value);
} elseif (! $isImmutable && $value instanceof DateTimeImmutable) {
    return DateTime::createFromImmutable($value);
}
ERROR: ParadoxicalCondition - src/DoctrineObject.php:620:23 - Condition (($value is DateTime) && ($isImmutable)) contradicts a previously-established condition ($value is not DateTime) (see https://psalm.dev/089)
                } if ($isImmutable && $value instanceof DateTime) {


ERROR: ParadoxicalCondition - src/DoctrineObject.php:622:27 - Condition (($value is DateTimeImmutable) && (!$isImmutable)) contradicts a previously-established condition ($value is not DateTimeImmutable) (see https://psalm.dev/089)
                } elseif ((! $isImmutable) && $value instanceof DateTimeImmutable) {

Rewriting the first if condition in two statements makes the error disappear:

$isImmutable = substr($typeOfField, -9) === 'immutable';

if ($isImmutable && $value instanceof DateTimeImmutable) {
    return $value;
} elseif (! $isImmutable && $value instanceof DateTime) {
    return $value;
} elseif ($isImmutable && $value instanceof DateTime) {
    return DateTimeImmutable::createFromMutable($value);
} elseif (! $isImmutable && $value instanceof DateTimeImmutable) {
    return DateTime::createFromImmutable($value);
}

Code example: https://psalm.dev/r/d26bab675e

Metadata

Metadata

Assignees

No one assigned

    Labels

    bughard problemsProblems without an obvious easy solution

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions