--- /dev/null
+# flags: --preview
+from typing import NoReturn, Protocol, Union, overload
+
+
+def dummy(a): ...
+def other(b): ...
+
+
+@overload
+def a(arg: int) -> int: ...
+@overload
+def a(arg: str) -> str: ...
+@overload
+def a(arg: object) -> NoReturn: ...
+def a(arg: Union[int, str, object]) -> Union[int, str]:
+ if not isinstance(arg, (int, str)):
+ raise TypeError
+ return arg
+
+class Proto(Protocol):
+ def foo(self, a: int) -> int:
+ ...
+
+ def bar(self, b: str) -> str: ...
+ def baz(self, c: bytes) -> str:
+ ...
+
+
+def dummy_two():
+ ...
+@dummy
+def dummy_three():
+ ...
+
+def dummy_four():
+ ...
+
+@overload
+def b(arg: int) -> int: ...
+
+@overload
+def b(arg: str) -> str: ...
+@overload
+def b(arg: object) -> NoReturn: ...
+
+def b(arg: Union[int, str, object]) -> Union[int, str]:
+ if not isinstance(arg, (int, str)):
+ raise TypeError
+ return arg
+
+# output
+
+from typing import NoReturn, Protocol, Union, overload
+
+
+def dummy(a): ...
+def other(b): ...
+
+
+@overload
+def a(arg: int) -> int: ...
+@overload
+def a(arg: str) -> str: ...
+@overload
+def a(arg: object) -> NoReturn: ...
+def a(arg: Union[int, str, object]) -> Union[int, str]:
+ if not isinstance(arg, (int, str)):
+ raise TypeError
+ return arg
+
+
+class Proto(Protocol):
+ def foo(self, a: int) -> int: ...
+
+ def bar(self, b: str) -> str: ...
+ def baz(self, c: bytes) -> str: ...
+
+
+def dummy_two(): ...
+@dummy
+def dummy_three(): ...
+
+
+def dummy_four(): ...
+
+
+@overload
+def b(arg: int) -> int: ...
+
+
+@overload
+def b(arg: str) -> str: ...
+@overload
+def b(arg: object) -> NoReturn: ...
+
+
+def b(arg: Union[int, str, object]) -> Union[int, str]:
+ if not isinstance(arg, (int, str)):
+ raise TypeError
+ return arg