We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Bug: compiler dislikes `x not in [a, b]` in 0.3.8, whereas it was fine in 0.3.7
### Version Information

* vyper Version (output of `vyper --version`): 0.3.8
* OS: osx
* Python Version (output of `python --version`): 3.10.4

### What's your issue about?

<img width="705" alt="image" src="https://user-images.githubusercontent.com/11488427/230437774-c3b68030-9319-4169-b344-dbb470002102.png">



--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `vyper/semantics/environment.py`
Content:
```
1 from typing import Dict
2 
3 from vyper.semantics.analysis.base import VarInfo
4 from vyper.semantics.types import AddressT, BytesT, VyperType
5 from vyper.semantics.types.shortcuts import BYTES32_T, UINT256_T
6 
7 
8 # common properties for environment variables
9 class _EnvType(VyperType):
10     def __eq__(self, other):
11         return self is other
12 
13     def __hash__(self):
14         return hash(id(self))
15 
16 
17 class _Block(_EnvType):
18     _id = "block"
19     _type_members = {
20         "coinbase": AddressT(),
21         "difficulty": UINT256_T,
22         "prevrandao": UINT256_T,
23         "number": UINT256_T,
24         "gaslimit": UINT256_T,
25         "basefee": UINT256_T,
26         "prevhash": BYTES32_T,
27         "timestamp": UINT256_T,
28     }
29 
30 
31 class _Chain(_EnvType):
32     _id = "chain"
33     _type_members = {"id": UINT256_T}
34 
35 
36 class _Msg(_EnvType):
37     _id = "msg"
38     _type_members = {"data": BytesT(), "gas": UINT256_T, "sender": AddressT(), "value": UINT256_T}
39 
40 
41 class _Tx(_EnvType):
42     _id = "tx"
43     _type_members = {"origin": AddressT(), "gasprice": UINT256_T}
44 
45 
46 CONSTANT_ENVIRONMENT_VARS = {t._id: t for t in (_Block(), _Chain(), _Tx(), _Msg())}
47 
48 
49 def get_constant_vars() -> Dict:
50     """
51     Get a dictionary of constant environment variables.
52     """
53     result = {}
54     for k, v in CONSTANT_ENVIRONMENT_VARS.items():
55         result[k] = VarInfo(v, is_constant=True)
56 
57     return result
58 
59 
60 # Not sure this is necessary, but add an ad-hoc type for `self` for clarity
61 class _SelfT(AddressT):
62     pass
63 
64 
65 MUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {"self": _SelfT}
66 
67 
68 def get_mutable_vars() -> Dict:
69     """
70     Get a dictionary of mutable environment variables (those that are
71     modified during the course of contract execution, such as `self`).
72     """
73     return {name: VarInfo(type_()) for name, type_ in MUTABLE_ENVIRONMENT_VARS.items()}
74
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/vyper/semantics/environment.py b/vyper/semantics/environment.py
--- a/vyper/semantics/environment.py
+++ b/vyper/semantics/environment.py
@@ -57,12 +57,7 @@
     return result
 
 
-# Not sure this is necessary, but add an ad-hoc type for `self` for clarity
-class _SelfT(AddressT):
-    pass
-
-
-MUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {"self": _SelfT}
+MUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {"self": AddressT}
 
 
 def get_mutable_vars() -> Dict:

{"golden_diff": "diff --git a/vyper/semantics/environment.py b/vyper/semantics/environment.py\n--- a/vyper/semantics/environment.py\n+++ b/vyper/semantics/environment.py\n@@ -57,12 +57,7 @@\n     return result\n \n \n-# Not sure this is necessary, but add an ad-hoc type for `self` for clarity\n-class _SelfT(AddressT):\n-    pass\n-\n-\n-MUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {\"self\": _SelfT}\n+MUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {\"self\": AddressT}\n \n \n def get_mutable_vars() -> Dict:\n", "issue": "Bug: compiler dislikes `x not in [a, b]` in 0.3.8, whereas it was fine in 0.3.7\n### Version Information\r\n\r\n* vyper Version (output of `vyper --version`): 0.3.8\r\n* OS: osx\r\n* Python Version (output of `python --version`): 3.10.4\r\n\r\n### What's your issue about?\r\n\r\n<img width=\"705\" alt=\"image\" src=\"https://user-images.githubusercontent.com/11488427/230437774-c3b68030-9319-4169-b344-dbb470002102.png\">\r\n\r\n\n", "before_files": [{"content": "from typing import Dict\n\nfrom vyper.semantics.analysis.base import VarInfo\nfrom vyper.semantics.types import AddressT, BytesT, VyperType\nfrom vyper.semantics.types.shortcuts import BYTES32_T, UINT256_T\n\n\n# common properties for environment variables\nclass _EnvType(VyperType):\n    def __eq__(self, other):\n        return self is other\n\n    def __hash__(self):\n        return hash(id(self))\n\n\nclass _Block(_EnvType):\n    _id = \"block\"\n    _type_members = {\n        \"coinbase\": AddressT(),\n        \"difficulty\": UINT256_T,\n        \"prevrandao\": UINT256_T,\n        \"number\": UINT256_T,\n        \"gaslimit\": UINT256_T,\n        \"basefee\": UINT256_T,\n        \"prevhash\": BYTES32_T,\n        \"timestamp\": UINT256_T,\n    }\n\n\nclass _Chain(_EnvType):\n    _id = \"chain\"\n    _type_members = {\"id\": UINT256_T}\n\n\nclass _Msg(_EnvType):\n    _id = \"msg\"\n    _type_members = {\"data\": BytesT(), \"gas\": UINT256_T, \"sender\": AddressT(), \"value\": UINT256_T}\n\n\nclass _Tx(_EnvType):\n    _id = \"tx\"\n    _type_members = {\"origin\": AddressT(), \"gasprice\": UINT256_T}\n\n\nCONSTANT_ENVIRONMENT_VARS = {t._id: t for t in (_Block(), _Chain(), _Tx(), _Msg())}\n\n\ndef get_constant_vars() -> Dict:\n    \"\"\"\n    Get a dictionary of constant environment variables.\n    \"\"\"\n    result = {}\n    for k, v in CONSTANT_ENVIRONMENT_VARS.items():\n        result[k] = VarInfo(v, is_constant=True)\n\n    return result\n\n\n# Not sure this is necessary, but add an ad-hoc type for `self` for clarity\nclass _SelfT(AddressT):\n    pass\n\n\nMUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {\"self\": _SelfT}\n\n\ndef get_mutable_vars() -> Dict:\n    \"\"\"\n    Get a dictionary of mutable environment variables (those that are\n    modified during the course of contract execution, such as `self`).\n    \"\"\"\n    return {name: VarInfo(type_()) for name, type_ in MUTABLE_ENVIRONMENT_VARS.items()}\n", "path": "vyper/semantics/environment.py"}], "after_files": [{"content": "from typing import Dict\n\nfrom vyper.semantics.analysis.base import VarInfo\nfrom vyper.semantics.types import AddressT, BytesT, VyperType\nfrom vyper.semantics.types.shortcuts import BYTES32_T, UINT256_T\n\n\n# common properties for environment variables\nclass _EnvType(VyperType):\n    def __eq__(self, other):\n        return self is other\n\n    def __hash__(self):\n        return hash(id(self))\n\n\nclass _Block(_EnvType):\n    _id = \"block\"\n    _type_members = {\n        \"coinbase\": AddressT(),\n        \"difficulty\": UINT256_T,\n        \"prevrandao\": UINT256_T,\n        \"number\": UINT256_T,\n        \"gaslimit\": UINT256_T,\n        \"basefee\": UINT256_T,\n        \"prevhash\": BYTES32_T,\n        \"timestamp\": UINT256_T,\n    }\n\n\nclass _Chain(_EnvType):\n    _id = \"chain\"\n    _type_members = {\"id\": UINT256_T}\n\n\nclass _Msg(_EnvType):\n    _id = \"msg\"\n    _type_members = {\"data\": BytesT(), \"gas\": UINT256_T, \"sender\": AddressT(), \"value\": UINT256_T}\n\n\nclass _Tx(_EnvType):\n    _id = \"tx\"\n    _type_members = {\"origin\": AddressT(), \"gasprice\": UINT256_T}\n\n\nCONSTANT_ENVIRONMENT_VARS = {t._id: t for t in (_Block(), _Chain(), _Tx(), _Msg())}\n\n\ndef get_constant_vars() -> Dict:\n    \"\"\"\n    Get a dictionary of constant environment variables.\n    \"\"\"\n    result = {}\n    for k, v in CONSTANT_ENVIRONMENT_VARS.items():\n        result[k] = VarInfo(v, is_constant=True)\n\n    return result\n\n\nMUTABLE_ENVIRONMENT_VARS: Dict[str, type] = {\"self\": AddressT}\n\n\ndef get_mutable_vars() -> Dict:\n    \"\"\"\n    Get a dictionary of mutable environment variables (those that are\n    modified during the course of contract execution, such as `self`).\n    \"\"\"\n    return {name: VarInfo(type_()) for name, type_ in MUTABLE_ENVIRONMENT_VARS.items()}\n", "path": "vyper/semantics/environment.py"}]}