diff --git a/.appveyor.yml b/.appveyor.yml
index 1738253..2d907d6 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -2,12 +2,12 @@
 install:
   - python -m pip install --upgrade tox virtualenv
 
-  - ps: (New-Object Net.WebClient).DownloadFile('https://bitbucket.org/pypy/pypy/downloads/pypy2.7-v7.1.1-win32.zip', "$env:appveyor_build_folder\pypy2.7-v7.1.1-win32.zip")
+  - ps: (New-Object Net.WebClient).DownloadFile('https://downloads.python.org/pypy/pypy2.7-v7.1.1-win32.zip', "$env:appveyor_build_folder\pypy2.7-v7.1.1-win32.zip")
   - ps: 7z x pypy2.7-v7.1.1-win32.zip | Out-Null
   - move pypy2.7-v7.1.1-win32 C:\
   - 'SET PATH=C:\pypy2.7-v7.1.1-win32\;%PATH%'
 
-  - ps: (New-Object Net.WebClient).DownloadFile('https://bitbucket.org/pypy/pypy/downloads/pypy3.6-v7.1.1-win32.zip', "$env:appveyor_build_folder\pypy3.6-v7.1.1-win32.zip")
+  - ps: (New-Object Net.WebClient).DownloadFile('https://downloads.python.org/pypy/pypy3.6-v7.1.1-win32.zip', "$env:appveyor_build_folder\pypy3.6-v7.1.1-win32.zip")
   - ps: 7z x pypy3.6-v7.1.1-win32.zip | Out-Null
   - move pypy3.6-v7.1.1-win32 C:\
   - 'SET PATH=C:\pypy3.6-v7.1.1-win32\;%PATH%'
diff --git a/pyflakes/checker.py b/pyflakes/checker.py
index 5af956c..1fbad48 100644
--- a/pyflakes/checker.py
+++ b/pyflakes/checker.py
@@ -542,7 +542,7 @@ class ExportBinding(Binding):
     can be determined statically, they will be treated as names for export and
     additional checking applied to them.
 
-    The only recognized C{__all__} assignment via list concatenation is in the
+    The only recognized C{__all__} assignment via list/tuple concatenation is in the
     following format:
 
         __all__ = ['a'] + ['b'] + ['c']
@@ -564,10 +564,10 @@ class ExportBinding(Binding):
 
         if isinstance(source.value, (ast.List, ast.Tuple)):
             _add_to_names(source.value)
-        # If concatenating lists
+        # If concatenating lists or tuples
         elif isinstance(source.value, ast.BinOp):
             currentValue = source.value
-            while isinstance(currentValue.right, ast.List):
+            while isinstance(currentValue.right, (ast.List, ast.Tuple)):
                 left = currentValue.left
                 right = currentValue.right
                 _add_to_names(right)
@@ -575,7 +575,7 @@ class ExportBinding(Binding):
                 if isinstance(left, ast.BinOp):
                     currentValue = left
                 # If just two lists are being added
-                elif isinstance(left, ast.List):
+                elif isinstance(left, (ast.List, ast.Tuple)):
                     _add_to_names(left)
                     # All lists accounted for - done
                     break

F822 (flake8): assigning result of adding tuples with wrong names to `__all__` doesn't warn
This properly warns (`example.py:4:1: F822 undefined name 'Test2' in __all__`):
```py
Test1 = "Test1"

__all__ = ("Test1",)
__all__ += ("Test2",)
```
And this doesn't:
```py
Test1 = "Test1"

__all__ = ("Test1",) + ("Test2",)
```

Version info:
```
$ flake8 --version
3.8.1 (mccabe: 0.6.1, pycodestyle: 2.6.0, pyflakes: 2.2.0) CPython 3.8.2 on Windows
```
diff --git a/pyflakes/test/test_imports.py b/pyflakes/test/test_imports.py
index 13e7bef..d5be269 100644
--- a/pyflakes/test/test_imports.py
+++ b/pyflakes/test/test_imports.py
@@ -1084,7 +1084,7 @@ class TestSpecialAll(TestCase):
             __all__ += ['c', 'd']
         ''', m.UndefinedExport, m.UndefinedExport)
 
-    def test_concatenationAssignment(self):
+    def test_list_concatenation_assignment(self):
         """
         The C{__all__} variable is defined through list concatenation.
         """
@@ -1093,6 +1093,15 @@ class TestSpecialAll(TestCase):
         __all__ = ['a'] + ['b'] + ['c']
         ''', m.UndefinedExport, m.UndefinedExport, m.UndefinedExport, m.UnusedImport)
 
+    def test_tuple_concatenation_assignment(self):
+        """
+        The C{__all__} variable is defined through tuple concatenation.
+        """
+        self.flakes('''
+        import sys
+        __all__ = ('a',) + ('b',) + ('c',)
+        ''', m.UndefinedExport, m.UndefinedExport, m.UndefinedExport, m.UnusedImport)
+
     def test_all_with_attributes(self):
         self.flakes('''
         from foo import bar

pip install -e .
parse_log_pytest
pytest
flake8==3.6.0 pytest
3.7
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///croot/attrs_1668696182826/work
certifi @ file:///croot/certifi_1671487769961/work/certifi
flake8==3.6.0
flit_core @ file:///opt/conda/conda-bld/flit-core_1644941570762/work/source/flit_core
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1648562407465/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
mccabe==0.6.1
packaging @ file:///croot/packaging_1671697413597/work
pluggy @ file:///tmp/build/80754af9/pluggy_1648042572264/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycodestyle==2.4.0
-e git+https://github.com/PyCQA/pyflakes.git@cd261abfe4cf7fcdaac5cef657ae3a16205fa0d7#egg=pyflakes
pytest==7.1.2
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
typing_extensions @ file:///croot/typing_extensions_1669924550328/work
zipp @ file:///croot/zipp_1672387121353/work

name: pyflakes
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=22.1.0=py37h06a4308_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - flit-core=3.6.0=pyhd3eb1b0_0
  - importlib-metadata=4.11.3=py37h06a4308_0
  - importlib_metadata=4.11.3=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=22.0=py37h06a4308_0
  - pip=22.3.1=py37h06a4308_0
  - pluggy=1.0.0=py37h06a4308_1
  - py=1.11.0=pyhd3eb1b0_0
  - pytest=7.1.2=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tomli=2.0.1=py37h06a4308_0
  - typing_extensions=4.4.0=py37h06a4308_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.11.0=py37h06a4308_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - flake8==3.6.0
      - mccabe==0.6.1
      - pycodestyle==2.4.0
prefix: /opt/conda/envs/pyflakes

pyflakes/test/test_imports.py::TestSpecialAll::test_tuple_concatenation_assignment
pyflakes/test/test_imports.py::TestImportationObject::test_import_as pyflakes/test/test_imports.py::TestImportationObject::test_import_basic pyflakes/test/test_imports.py::TestImportationObject::test_import_submodule pyflakes/test/test_imports.py::TestImportationObject::test_import_submodule_as pyflakes/test/test_imports.py::TestImportationObject::test_import_submodule_as_source_name pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_future pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_member pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_member_as pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_relative pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_relative_parent pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_relative_with_module pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_relative_with_module_as pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_star pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_star_relative pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_submodule_member pyflakes/test/test_imports.py::TestImportationObject::test_importfrom_submodule_member_as pyflakes/test/test_imports.py::TestImportationObject::test_unusedImport_underscore pyflakes/test/test_imports.py::Test::test_aliasedImport pyflakes/test/test_imports.py::Test::test_aliasedImportShadowModule pyflakes/test/test_imports.py::Test::test_assignRHSFirst pyflakes/test/test_imports.py::Test::test_assignedToGlobal pyflakes/test/test_imports.py::Test::test_differentSubmoduleImport pyflakes/test/test_imports.py::Test::test_duplicateSubmoduleImport pyflakes/test/test_imports.py::Test::test_functionNamesAreBoundNow pyflakes/test/test_imports.py::Test::test_functionsRunLater pyflakes/test/test_imports.py::Test::test_futureImport pyflakes/test/test_imports.py::Test::test_futureImportFirst pyflakes/test/test_imports.py::Test::test_futureImportStar pyflakes/test/test_imports.py::Test::test_futureImportUndefined pyflakes/test/test_imports.py::Test::test_futureImportUsed pyflakes/test/test_imports.py::Test::test_ignoreNonImportRedefinitions pyflakes/test/test_imports.py::Test::test_importInClass pyflakes/test/test_imports.py::Test::test_importStar pyflakes/test/test_imports.py::Test::test_importStar_relative pyflakes/test/test_imports.py::Test::test_importUsedInMethodDefinition pyflakes/test/test_imports.py::Test::test_importedInClass pyflakes/test/test_imports.py::Test::test_localImportStar pyflakes/test/test_imports.py::Test::test_methodsDontUseClassScope pyflakes/test/test_imports.py::Test::test_nestedClassAndFunctionScope pyflakes/test/test_imports.py::Test::test_nestedFunctionsNestScope pyflakes/test/test_imports.py::Test::test_newAssignment pyflakes/test/test_imports.py::Test::test_nonGlobalDoesNotRedefine pyflakes/test/test_imports.py::Test::test_notUsedInNestedScope pyflakes/test/test_imports.py::Test::test_packageImport pyflakes/test/test_imports.py::Test::test_redefinedButUsedLater pyflakes/test/test_imports.py::Test::test_redefinedByClass pyflakes/test/test_imports.py::Test::test_redefinedByExcept pyflakes/test/test_imports.py::Test::test_redefinedByFor pyflakes/test/test_imports.py::Test::test_redefinedByFunction pyflakes/test/test_imports.py::Test::test_redefinedBySubclass pyflakes/test/test_imports.py::Test::test_redefinedIf pyflakes/test/test_imports.py::Test::test_redefinedIfElse pyflakes/test/test_imports.py::Test::test_redefinedInClass pyflakes/test/test_imports.py::Test::test_redefinedInNestedFunction pyflakes/test/test_imports.py::Test::test_redefinedInNestedFunctionTwice pyflakes/test/test_imports.py::Test::test_redefinedTry pyflakes/test/test_imports.py::Test::test_redefinedTryElse pyflakes/test/test_imports.py::Test::test_redefinedTryExcept pyflakes/test/test_imports.py::Test::test_redefinedTryExceptElse pyflakes/test/test_imports.py::Test::test_redefinedTryExceptElseFinally pyflakes/test/test_imports.py::Test::test_redefinedTryExceptFinally pyflakes/test/test_imports.py::Test::test_redefinedTryExceptMulti pyflakes/test/test_imports.py::Test::test_redefinedTryNested pyflakes/test/test_imports.py::Test::test_redefinedWhileUnused pyflakes/test/test_imports.py::Test::test_shadowedByFor pyflakes/test/test_imports.py::Test::test_shadowedByForDeep pyflakes/test/test_imports.py::Test::test_shadowedByLambda pyflakes/test/test_imports.py::Test::test_shadowedByParameter pyflakes/test/test_imports.py::Test::test_tryingMultipleImports pyflakes/test/test_imports.py::Test::test_unusedImport pyflakes/test/test_imports.py::Test::test_unusedImport_relative pyflakes/test/test_imports.py::Test::test_unusedInNestedScope pyflakes/test/test_imports.py::Test::test_unusedPackageImport pyflakes/test/test_imports.py::Test::test_unused_package_with_submodule_import pyflakes/test/test_imports.py::Test::test_usedAndGlobal pyflakes/test/test_imports.py::Test::test_usedImport pyflakes/test/test_imports.py::Test::test_usedImport_relative pyflakes/test/test_imports.py::Test::test_usedInAssert pyflakes/test/test_imports.py::Test::test_usedInAssignment pyflakes/test/test_imports.py::Test::test_usedInAttributeAssign pyflakes/test/test_imports.py::Test::test_usedInCall pyflakes/test/test_imports.py::Test::test_usedInClass pyflakes/test/test_imports.py::Test::test_usedInClassBase pyflakes/test/test_imports.py::Test::test_usedInDict pyflakes/test/test_imports.py::Test::test_usedInElifConditional pyflakes/test/test_imports.py::Test::test_usedInElse pyflakes/test/test_imports.py::Test::test_usedInExcept pyflakes/test/test_imports.py::Test::test_usedInExec pyflakes/test/test_imports.py::Test::test_usedInFor pyflakes/test/test_imports.py::Test::test_usedInForElse pyflakes/test/test_imports.py::Test::test_usedInFunction pyflakes/test/test_imports.py::Test::test_usedInGetattr pyflakes/test/test_imports.py::Test::test_usedInGlobal pyflakes/test/test_imports.py::Test::test_usedInIfBody pyflakes/test/test_imports.py::Test::test_usedInIfConditional pyflakes/test/test_imports.py::Test::test_usedInKeywordArg pyflakes/test/test_imports.py::Test::test_usedInLambda pyflakes/test/test_imports.py::Test::test_usedInList pyflakes/test/test_imports.py::Test::test_usedInListComp pyflakes/test/test_imports.py::Test::test_usedInLogic pyflakes/test/test_imports.py::Test::test_usedInOperators pyflakes/test/test_imports.py::Test::test_usedInParameterDefault pyflakes/test/test_imports.py::Test::test_usedInRaise pyflakes/test/test_imports.py::Test::test_usedInReturn pyflakes/test/test_imports.py::Test::test_usedInSlice pyflakes/test/test_imports.py::Test::test_usedInSliceObj pyflakes/test/test_imports.py::Test::test_usedInSubscript pyflakes/test/test_imports.py::Test::test_usedInTry pyflakes/test/test_imports.py::Test::test_usedInTryFinally pyflakes/test/test_imports.py::Test::test_usedInTuple pyflakes/test/test_imports.py::Test::test_usedInWhile pyflakes/test/test_imports.py::Test::test_usedInYield pyflakes/test/test_imports.py::Test::test_used_package_with_submodule_import pyflakes/test/test_imports.py::Test::test_used_package_with_submodule_import_of_alias pyflakes/test/test_imports.py::TestSpecialAll::test_all_mixed_attributes_and_strings pyflakes/test/test_imports.py::TestSpecialAll::test_all_with_attributes pyflakes/test/test_imports.py::TestSpecialAll::test_all_with_attributes_added pyflakes/test/test_imports.py::TestSpecialAll::test_all_with_names pyflakes/test/test_imports.py::TestSpecialAll::test_augmentedAssignment pyflakes/test/test_imports.py::TestSpecialAll::test_ignoredInClass pyflakes/test/test_imports.py::TestSpecialAll::test_ignoredInFunction pyflakes/test/test_imports.py::TestSpecialAll::test_importStarExported pyflakes/test/test_imports.py::TestSpecialAll::test_importStarNotExported pyflakes/test/test_imports.py::TestSpecialAll::test_list_concatenation_assignment pyflakes/test/test_imports.py::TestSpecialAll::test_redefinedByGenExp pyflakes/test/test_imports.py::TestSpecialAll::test_unboundExported pyflakes/test/test_imports.py::TestSpecialAll::test_usedAsClassDecorator pyflakes/test/test_imports.py::TestSpecialAll::test_usedAsDecorator pyflakes/test/test_imports.py::TestSpecialAll::test_usedInGenExp pyflakes/test/test_imports.py::TestSpecialAll::test_warningSuppressed
pyflakes/checker.py .appveyor.yml
pyflakes/checker.py .appveyor.yml