summaryrefslogtreecommitdiff
path: root/tests/functional/p/postponed
diff options
context:
space:
mode:
Diffstat (limited to 'tests/functional/p/postponed')
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_activated.py28
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_activated.rc2
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py28
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc2
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_not_activated.py14
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_not_activated.rc2
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_not_activated.txt2
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585.py141
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585.rc3
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585.txt19
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585_error.py124
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585_error.rc3
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585_error.txt49
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585_py39.py128
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc2
-rw-r--r--tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt1
16 files changed, 548 insertions, 0 deletions
diff --git a/tests/functional/p/postponed/postponed_evaluation_activated.py b/tests/functional/p/postponed/postponed_evaluation_activated.py
new file mode 100644
index 000000000..3492fe5c2
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_activated.py
@@ -0,0 +1,28 @@
+# pylint: disable=missing-docstring,unused-argument,pointless-statement
+# pylint: disable=too-few-public-methods,no-name-in-module
+from __future__ import annotations
+
+
+class Class:
+ @classmethod
+ def from_string(cls, source) -> Class:
+ ...
+
+ def validate_b(self, obj: OtherClass) -> bool:
+ ...
+
+
+class OtherClass:
+ ...
+
+
+class Example:
+ obj: Other
+
+
+class Other:
+ ...
+
+
+class ExampleSelf:
+ next: ExampleSelf
diff --git a/tests/functional/p/postponed/postponed_evaluation_activated.rc b/tests/functional/p/postponed/postponed_evaluation_activated.rc
new file mode 100644
index 000000000..a17bb22da
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_activated.rc
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.7
diff --git a/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py
new file mode 100644
index 000000000..f9899f34a
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.py
@@ -0,0 +1,28 @@
+# pylint: disable=missing-docstring,unused-argument,pointless-statement
+# pylint: disable=too-few-public-methods,no-name-in-module
+from __future__ import annotations as __annotations__
+
+
+class MyClass:
+ @classmethod
+ def from_string(cls, source) -> MyClass:
+ ...
+
+ def validate_b(self, obj: OtherClass) -> bool:
+ ...
+
+
+class OtherClass:
+ ...
+
+
+class Example:
+ obj: Other
+
+
+class Other:
+ ...
+
+
+class ExampleSelf:
+ next: ExampleSelf
diff --git a/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc
new file mode 100644
index 000000000..a17bb22da
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_activated_with_alias.rc
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.7
diff --git a/tests/functional/p/postponed/postponed_evaluation_not_activated.py b/tests/functional/p/postponed/postponed_evaluation_not_activated.py
new file mode 100644
index 000000000..76e564a9a
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_not_activated.py
@@ -0,0 +1,14 @@
+# pylint: disable=missing-docstring,unused-argument,pointless-statement
+# pylint: disable=too-few-public-methods
+
+class Class:
+ @classmethod
+ def from_string(cls, source) -> Class: # [undefined-variable]
+ ...
+
+ def validate_b(self, obj: OtherClass) -> bool: # [used-before-assignment]
+ ...
+
+
+class OtherClass:
+ ...
diff --git a/tests/functional/p/postponed/postponed_evaluation_not_activated.rc b/tests/functional/p/postponed/postponed_evaluation_not_activated.rc
new file mode 100644
index 000000000..a17bb22da
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_not_activated.rc
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.7
diff --git a/tests/functional/p/postponed/postponed_evaluation_not_activated.txt b/tests/functional/p/postponed/postponed_evaluation_not_activated.txt
new file mode 100644
index 000000000..8d9630e04
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_not_activated.txt
@@ -0,0 +1,2 @@
+undefined-variable:6:36:6:41:Class.from_string:Undefined variable 'Class':UNDEFINED
+used-before-assignment:9:30:9:40:Class.validate_b:Using variable 'OtherClass' before assignment:HIGH
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585.py b/tests/functional/p/postponed/postponed_evaluation_pep585.py
new file mode 100644
index 000000000..2317228e5
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585.py
@@ -0,0 +1,141 @@
+"""Test PEP 585 in combination with postponed evaluation PEP 563.
+
+This check requires Python 3.7 or 3.8!
+Testing with 3.8 only, to support TypedDict.
+"""
+
+# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name
+# pylint: disable=inherit-non-class,unsupported-binary-operation,wrong-import-position,ungrouped-imports
+# pylint: disable=unused-variable,unnecessary-direct-lambda-call
+
+# Disabled because of a bug with pypy 3.8 see
+# https://github.com/pylint-dev/pylint/pull/7918#issuecomment-1352737369
+# pylint: disable=multiple-statements
+
+from __future__ import annotations
+import collections
+import dataclasses
+import typing
+from dataclasses import dataclass
+from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple
+
+
+AliasInvalid = list[int] # [unsubscriptable-object]
+
+class CustomIntList(typing.List[int]):
+ pass
+
+class CustomIntListError(list[int]): # [unsubscriptable-object]
+ pass
+
+cast_variable = [1, 2, 3]
+cast_variable = typing.cast(list[int], cast_variable) # [unsubscriptable-object]
+
+T = typing.TypeVar("T", list[int], str) # [unsubscriptable-object]
+
+(lambda x: 2)(list[int]) # [unsubscriptable-object]
+
+
+# Check typing.NamedTuple
+CustomNamedTuple = typing.NamedTuple(
+ "CustomNamedTuple", [("my_var", list[int])]) # [unsubscriptable-object]
+
+class CustomNamedTuple2(NamedTuple):
+ my_var: list[int]
+
+class CustomNamedTuple3(typing.NamedTuple):
+ my_var: list[int]
+
+
+# Check typing.TypedDict
+CustomTypedDict = TypedDict("CustomTypedDict", my_var=list[int]) # [unsubscriptable-object]
+
+CustomTypedDict2 = TypedDict("CustomTypedDict2", {"my_var": list[int]}) # [unsubscriptable-object]
+
+class CustomTypedDict3(TypedDict):
+ my_var: list[int]
+
+class CustomTypedDict4(typing.TypedDict):
+ my_var: list[int]
+
+
+# Check dataclasses
+def my_decorator(*args, **kwargs):
+ def wraps(*args, **kwargs):
+ pass
+ return wraps
+
+@dataclass
+class CustomDataClass:
+ my_var: list[int]
+
+@dataclasses.dataclass
+class CustomDataClass2:
+ my_var: list[int]
+
+@dataclass()
+class CustomDataClass3:
+ my_var: list[int]
+
+@my_decorator
+@dataclasses.dataclass
+class CustomDataClass4:
+ my_var: list[int]
+
+
+var1: set[int]
+var2: collections.OrderedDict[str, int]
+var3: dict[str, list[int]]
+var4: Dict[str, list[int]]
+var5: dict[tuple[int, int], str]
+var6: Dict[tuple[int, int], str]
+var7: list[list[int]]
+var8: tuple[list[int]]
+var9: int | list[str | int]
+var10: Union[list[str], None]
+var11: Union[Union[list[int], int]]
+
+def func(arg: list[int]):
+ pass
+
+def func2() -> list[int]:
+ pass
+
+Alias2 = Union[list[str], None] # [unsubscriptable-object]
+Alias3 = Union[Union[list[int], int]] # [unsubscriptable-object]
+Alias4 = Tuple[list[int]] # [unsubscriptable-object]
+Alias5 = Dict[str, list[int]] # [unsubscriptable-object]
+Alias6 = int | list[int] # [unsubscriptable-object]
+Alias7 = list[list[int]] # [unsubscriptable-object,unsubscriptable-object]
+
+
+import collections.abc
+import contextlib
+import re
+
+class OrderedDict:
+ pass
+
+var12: OrderedDict[str, int] # string annotations aren't checked
+var13: list[int]
+var14: collections.OrderedDict[str, int]
+var15: collections.Counter[int]
+var16: collections.abc.Iterable[int]
+var17: contextlib.AbstractContextManager[int]
+var18: re.Pattern[str]
+
+
+def func3():
+ AliasInvalid2 = list[int] # [unsubscriptable-object]
+ cast_variable2 = [1, 2, 3]
+ cast_variable2 = typing.cast(list[int], cast_variable2) # [unsubscriptable-object]
+ var19: list[int]
+
+def func4(arg=list[int]): # [unsubscriptable-object]
+ pass
+
+def func5(arg1: list[int], arg2=set[int]): # [unsubscriptable-object]
+ pass
+
+def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
+ pass
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585.rc b/tests/functional/p/postponed/postponed_evaluation_pep585.rc
new file mode 100644
index 000000000..35b185fdb
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585.rc
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=3.8
+max_pyver=3.9
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585.txt b/tests/functional/p/postponed/postponed_evaluation_pep585.txt
new file mode 100644
index 000000000..899dc5977
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585.txt
@@ -0,0 +1,19 @@
+unsubscriptable-object:23:15:23:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:28:25:28:29:CustomIntListError:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:32:28:32:32::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:34:24:34:28::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:36:14:36:18::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:41:36:41:40::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:51:54:51:58::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:53:60:53:64::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:104:15:104:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:105:21:105:25::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:106:15:106:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:107:19:107:23::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:108:15:108:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:109:9:109:13::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:109:14:109:18::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:129:20:129:24:func3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:131:33:131:37:func3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:134:14:134:18:func4:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:137:32:137:35:func5:Value 'set' is unsubscriptable:UNDEFINED
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_error.py b/tests/functional/p/postponed/postponed_evaluation_pep585_error.py
new file mode 100644
index 000000000..9810c0c14
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585_error.py
@@ -0,0 +1,124 @@
+"""Test PEP 585 without postponed evaluation. Everything should fail.
+
+This check requires Python 3.7 or Python 3.8!
+Testing with 3.8 only, to support TypedDict.
+"""
+
+# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods
+# pylint: disable=invalid-name,inherit-non-class,unsupported-binary-operation
+# pylint: disable=unused-variable,line-too-long,unnecessary-direct-lambda-call
+
+# Disabled because of a bug with pypy 3.8 see
+# https://github.com/pylint-dev/pylint/pull/7918#issuecomment-1352737369
+# pylint: disable=multiple-statements
+
+import collections
+import dataclasses
+import typing
+from dataclasses import dataclass
+from typing import Any, Dict, NamedTuple, TypedDict, Union
+
+
+AliasInvalid = list[int] # [unsubscriptable-object]
+
+class CustomIntList(typing.List[int]):
+ pass
+
+class CustomIntListError(list[int]): # [unsubscriptable-object]
+ pass
+
+cast_variable = [1, 2, 3]
+cast_variable = typing.cast(list[int], cast_variable) # [unsubscriptable-object]
+
+T = typing.TypeVar("T", list[int], str) # [unsubscriptable-object]
+
+(lambda x: 2)(list[int]) # [unsubscriptable-object]
+
+
+# Check typing.NamedTuple
+CustomNamedTuple = typing.NamedTuple(
+ "CustomNamedTuple", [("my_var", list[int])]) # [unsubscriptable-object]
+
+class CustomNamedTuple2(NamedTuple):
+ my_var: list[int] # [unsubscriptable-object]
+
+class CustomNamedTuple3(typing.NamedTuple):
+ my_var: list[int] # [unsubscriptable-object]
+
+
+# Check typing.TypedDict
+CustomTypedDict = TypedDict("CustomTypedDict", my_var=list[int]) # [unsubscriptable-object]
+
+CustomTypedDict2 = TypedDict("CustomTypedDict2", {"my_var": list[int]}) # [unsubscriptable-object]
+
+class CustomTypedDict3(TypedDict):
+ my_var: list[int] # [unsubscriptable-object]
+
+class CustomTypedDict4(typing.TypedDict):
+ my_var: list[int] # [unsubscriptable-object]
+
+
+# Check dataclasses
+def my_decorator(*args, **kwargs):
+ def wraps(*args, **kwargs):
+ pass
+ return wraps
+
+@dataclass
+class CustomDataClass:
+ my_var: list[int] # [unsubscriptable-object]
+
+@dataclasses.dataclass
+class CustomDataClass2:
+ my_var: list[int] # [unsubscriptable-object]
+
+@dataclass()
+class CustomDataClass3:
+ my_var: list[int] # [unsubscriptable-object]
+
+@my_decorator
+@dataclasses.dataclass
+class CustomDataClass4:
+ my_var: list[int] # [unsubscriptable-object]
+
+
+var1: set[int] # [unsubscriptable-object]
+var2: collections.OrderedDict[str, int] # [unsubscriptable-object]
+var3: dict[str, list[int]] # [unsubscriptable-object,unsubscriptable-object]
+var4: Dict[str, list[int]] # [unsubscriptable-object]
+var5: dict[tuple[int, int], str] # [unsubscriptable-object,unsubscriptable-object]
+var6: Dict[tuple[int, int], str] # [unsubscriptable-object]
+var7: list[list[int]] # [unsubscriptable-object,unsubscriptable-object]
+var8: tuple[list[int]] # [unsubscriptable-object,unsubscriptable-object]
+var9: int | list[str | int] # [unsubscriptable-object]
+var10: Union[list[str], None] # [unsubscriptable-object]
+var11: Union[Union[list[int], int]] # [unsubscriptable-object]
+
+def func(arg: list[int]): # [unsubscriptable-object]
+ pass
+
+def func2() -> list[int]: # [unsubscriptable-object]
+ pass
+
+Alias2 = Union[list[str], None] # [unsubscriptable-object]
+Alias3 = Union[Union[list[int], int]] # [unsubscriptable-object]
+Alias5 = Dict[str, list[int]] # [unsubscriptable-object]
+Alias6 = int | list[int] # [unsubscriptable-object]
+Alias7 = list[list[int]] # [unsubscriptable-object,unsubscriptable-object]
+
+
+def func3():
+ AliasInvalid2 = list[int] # [unsubscriptable-object]
+ cast_variable2 = [1, 2, 3]
+ cast_variable2 = typing.cast(list[int], cast_variable2) # [unsubscriptable-object]
+ var12: list[int] # [unsubscriptable-object]
+
+def func4(var=list[int]): # [unsubscriptable-object]
+ pass
+
+def func5(arg1: list[int], arg2=set[int]): # [unsubscriptable-object,unsubscriptable-object]
+ pass
+
+def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
+ # -1:[unsubscriptable-object,unsubscriptable-object,unsubscriptable-object,unsubscriptable-object]
+ pass
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_error.rc b/tests/functional/p/postponed/postponed_evaluation_pep585_error.rc
new file mode 100644
index 000000000..35b185fdb
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585_error.rc
@@ -0,0 +1,3 @@
+[testoptions]
+min_pyver=3.8
+max_pyver=3.9
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_error.txt b/tests/functional/p/postponed/postponed_evaluation_pep585_error.txt
new file mode 100644
index 000000000..406081dfa
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585_error.txt
@@ -0,0 +1,49 @@
+unsubscriptable-object:22:15:22:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:27:25:27:29:CustomIntListError:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:31:28:31:32::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:33:24:33:28::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:35:14:35:18::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:40:36:40:40::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:43:12:43:16:CustomNamedTuple2:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:46:12:46:16:CustomNamedTuple3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:50:54:50:58::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:52:60:52:64::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:55:12:55:16:CustomTypedDict3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:58:12:58:16:CustomTypedDict4:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:69:12:69:16:CustomDataClass:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:73:12:73:16:CustomDataClass2:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:77:12:77:16:CustomDataClass3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:82:12:82:16:CustomDataClass4:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:85:6:85:9::Value 'set' is unsubscriptable:UNDEFINED
+unsubscriptable-object:86:6:86:29::Value 'collections.OrderedDict' is unsubscriptable:UNDEFINED
+unsubscriptable-object:87:6:87:10::Value 'dict' is unsubscriptable:UNDEFINED
+unsubscriptable-object:87:16:87:20::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:88:16:88:20::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:89:6:89:10::Value 'dict' is unsubscriptable:UNDEFINED
+unsubscriptable-object:89:11:89:16::Value 'tuple' is unsubscriptable:UNDEFINED
+unsubscriptable-object:90:11:90:16::Value 'tuple' is unsubscriptable:UNDEFINED
+unsubscriptable-object:91:6:91:10::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:91:11:91:15::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:92:12:92:16::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:92:6:92:11::Value 'tuple' is unsubscriptable:UNDEFINED
+unsubscriptable-object:93:12:93:16::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:94:13:94:17::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:95:19:95:23::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:97:14:97:18:func:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:100:15:100:19:func2:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:103:15:103:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:104:21:104:25::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:105:19:105:23::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:106:15:106:19::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:107:9:107:13::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:107:14:107:18::Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:111:20:111:24:func3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:113:33:113:37:func3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:114:11:114:15:func3:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:116:14:116:18:func4:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:119:16:119:20:func5:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:119:32:119:35:func5:Value 'set' is unsubscriptable:UNDEFINED
+unsubscriptable-object:122:75:122:79:func6:Value 'dict' is unsubscriptable:UNDEFINED
+unsubscriptable-object:122:16:122:20:func6:Value 'list' is unsubscriptable:UNDEFINED
+unsubscriptable-object:122:55:122:58:func6:Value 'set' is unsubscriptable:UNDEFINED
+unsubscriptable-object:122:37:122:42:func6:Value 'tuple' is unsubscriptable:UNDEFINED
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_py39.py b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.py
new file mode 100644
index 000000000..5354e081f
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.py
@@ -0,0 +1,128 @@
+"""Test PEP 585 works as expected, starting with Python 3.9"""
+# pylint: disable=missing-docstring,unused-argument,unused-import,too-few-public-methods,invalid-name,inherit-non-class,unsupported-binary-operation,wrong-import-position,ungrouped-imports,unused-variable,unnecessary-direct-lambda-call
+import collections
+import dataclasses
+import typing
+from dataclasses import dataclass
+from typing import Any, Dict, NamedTuple, TypedDict, Union, Tuple
+
+
+AliasValid = list[int]
+
+class CustomIntList(typing.List[int]):
+ pass
+
+class CustomIntListError(list[int]):
+ pass
+
+cast_variable = [1, 2, 3]
+cast_variable = typing.cast(list[int], cast_variable)
+
+T = typing.TypeVar("T", list[int], str)
+
+(lambda x: 2)(list[int])
+
+
+# Check typing.NamedTuple
+CustomNamedTuple = typing.NamedTuple(
+ "CustomNamedTuple", [("my_var", list[int])])
+
+class CustomNamedTuple2(NamedTuple):
+ my_var: list[int]
+
+class CustomNamedTuple3(typing.NamedTuple):
+ my_var: list[int]
+
+
+# Check typing.TypedDict
+CustomTypedDict = TypedDict("CustomTypedDict", my_var=list[int])
+
+CustomTypedDict2 = TypedDict("CustomTypedDict2", {"my_var": list[int]})
+
+class CustomTypedDict3(TypedDict):
+ my_var: list[int]
+
+class CustomTypedDict4(typing.TypedDict):
+ my_var: list[int]
+
+
+# Check dataclasses
+def my_decorator(*args, **kwargs):
+ def wraps(*args, **kwargs):
+ pass
+ return wraps
+
+@dataclass
+class CustomDataClass:
+ my_var: list[int]
+
+@dataclasses.dataclass
+class CustomDataClass2:
+ my_var: list[int]
+
+@dataclass()
+class CustomDataClass3:
+ my_var: list[int]
+
+@my_decorator
+@dataclasses.dataclass
+class CustomDataClass4:
+ my_var: list[int]
+
+
+var1: set[int]
+var2: collections.OrderedDict[str, int]
+var3: dict[str, list[int]]
+var4: Dict[str, list[int]]
+var5: dict[tuple[int, int], str]
+var6: Dict[tuple[int, int], str]
+var7: list[list[int]]
+var8: tuple[list[int]]
+var9: int | list[str | int]
+var10: Union[list[str], None]
+var11: Union[Union[list[int], int]]
+
+def func(arg: list[int]):
+ pass
+
+def func2() -> list[int]:
+ pass
+
+Alias2 = Union[list[str], None]
+Alias3 = Union[Union[list[int], int]]
+Alias4 = Tuple[list[int]]
+Alias5 = Dict[str, list[int]]
+Alias6 = int | list[int]
+Alias7 = list[list[int]]
+
+
+import collections.abc
+import contextlib
+import re
+
+class OrderedDict:
+ pass
+
+var12: OrderedDict[str, int] # [unsubscriptable-object]
+var13: list[int]
+var14: collections.OrderedDict[str, int]
+var15: collections.Counter[int]
+var16: collections.abc.Iterable[int]
+var17: contextlib.AbstractContextManager[int]
+var18: re.Pattern[str]
+
+
+def func3():
+ AliasInvalid2 = list[int]
+ cast_variable2 = [1, 2, 3]
+ cast_variable2 = typing.cast(list[int], cast_variable2)
+ var19: list[int]
+
+def func4(var=list[int]):
+ pass
+
+def func5(arg1: list[int], arg2=set[int]):
+ pass
+
+def func6(arg1: list[int], /, *args: tuple[str], arg2: set[int], **kwargs: dict[str, Any]):
+ pass
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc
new file mode 100644
index 000000000..16b75eea7
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.rc
@@ -0,0 +1,2 @@
+[testoptions]
+min_pyver=3.9
diff --git a/tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt
new file mode 100644
index 000000000..127e252a5
--- /dev/null
+++ b/tests/functional/p/postponed/postponed_evaluation_pep585_py39.txt
@@ -0,0 +1 @@
+unsubscriptable-object:106:7:106:18::Value 'OrderedDict' is unsubscriptable:UNDEFINED