diff --git a/src/Psalm/Internal/Analyzer/ClassAnalyzer.php b/src/Psalm/Internal/Analyzer/ClassAnalyzer.php index 4e6ef467bcb..e4324c9a233 100644 --- a/src/Psalm/Internal/Analyzer/ClassAnalyzer.php +++ b/src/Psalm/Internal/Analyzer/ClassAnalyzer.php @@ -1127,8 +1127,11 @@ private function checkPropertyInitialization( $uninitialized_variables[] = '$this->' . $property_name; $uninitialized_properties[$property_class_name . '::$' . $property_name] = $property; - if ($property->type && !$property->type->isMixed()) { - $uninitialized_typed_properties[$property_class_name . '::$' . $property_name] = $property; + if ($property->type) { + // Complain about all natively typed properties and all non-mixed docblock typed properties + if (!$property->type->from_docblock || !$property->type->isMixed()) { + $uninitialized_typed_properties[$property_class_name . '::$' . $property_name] = $property; + } } } diff --git a/tests/PropertyTypeTest.php b/tests/PropertyTypeTest.php index f34e1c53cf5..bf8e00f4ea5 100644 --- a/tests/PropertyTypeTest.php +++ b/tests/PropertyTypeTest.php @@ -3827,6 +3827,15 @@ class A { ', 'error_message' => 'UndefinedPropertyAssignment', ], + 'nativeMixedPropertyWithNoConstructor' => [ + 'code' => <<< 'PHP' + 'MissingConstructor', + ], ]; } }