prompt: 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()
  
  ```
  
golden_diff: 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:
  
verification_info: {"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"}]}