<pre style='margin:0'>
Christopher Nielsen (mascguy) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/9b1a080a3f8857c15a6a953776e7016edc0009e3">https://github.com/macports/macports-ports/commit/9b1a080a3f8857c15a6a953776e7016edc0009e3</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 9b1a080a3f8 clang-11-bootstrap: backport support of `using_if_exists`
</span>9b1a080a3f8 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 9b1a080a3f8857c15a6a953776e7016edc0009e3
</span>Author: Kirill A. Korinsky <kirill@korins.ky>
AuthorDate: Tue Aug 30 14:36:01 2022 +0200

<span style='display:block; white-space:pre;color:#404040;'>    clang-11-bootstrap: backport support of `using_if_exists`
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    That allows to build clang-15.0.0-rc3 by this compiler.
</span>---
 lang/clang-11-bootstrap/Portfile                   |   6 +-
 ...MASK_CRASH-and-MACH_EXCEPTION_CODES-if-th.patch |   4 +-
 ...ly-Don-t-embed-the-deployment-target-in-t.patch |   4 +-
 ...ssues-pre-Lion-due-to-missing-a-strnlen-d.patch |   3 +-
 ...ssues-pre-Lion-due-to-missing-a-memmem-de.patch |   3 +-
 ...nly-call-pthread_setname_np-on-SnowLeopar.patch |   3 +-
 ...etpriority-PRIO_DARWIN_THREAD-0-PRIO_DARW.patch |   4 +-
 .../files/0007-dsymutil-fix-build-on-Leopard.patch |   2 +-
 ...-Unix-Path.inc-define-COPYFILE_CLONE-if-n.patch |   3 +-
 ...ly-Fix-name-of-scan-view-executable-insid.patch |   2 +-
 .../0010-default-to-libcxx-on-all-systems.patch    |   2 +-
 ...fragile-ObjC-runtime-when-targeting-darwi.patch |   3 +-
 ...dc-header-search-paths-for-older-versions.patch |   4 +-
 ...oat.h-to-work-on-Snow-Leopard-and-earlier.patch |   2 +-
 ...er-rt-add-some-defs-missing-in-older-SDKs.patch |   2 +-
 ...ss-compiler-rt-work-around-no-libdispatch.patch |   4 +-
 ...-long-long-math-prototypes-when-using-the.patch |   4 +-
 ...tomic-using-mutex-lock_guard-for-64b-ops-.patch |   4 +-
 ...xx-src-chrono.cpp-fix-build-by-older-SDKs.patch |   2 +-
 .../0019-compiler-rt-allow-build-before-10.7.patch |   2 +-
 ...-added-CMAKE_OSX_DEPLOYMENT_TARGET-fallba.patch |   2 +-
 ...k-runtime-libraries-used-on-10.4-and-10.5.patch |   2 +-
 ...into-sysroot-for-C-headers-if-they-are-fo.patch |   4 +-
 ...sable-DirectoryWatcher-when-builds-by-GCC.patch |   2 +-
 .../0024-Use-for-long-options-in-help-text.patch   |   2 +-
 ...0025-compatibility-with-xar-on-macOS-10.5.patch |   2 +-
 .../0026-clang-support-macports-libstdcxx.patch    |   2 +-
 .../0027-compiler-rt-fix-building-by-GCC.patch     |   2 +-
 ...ompiler-rt-allow-to-define-required-archs.patch |   2 +-
 ...er-rt-atomic-which-can-be-compiled-by-GCC.patch |   2 +-
 .../0030-fix-building-on-10.10-by-GCC-10.patch     |   2 +-
 ...1-fix-build-of-shared-libc-.dylib-on-10.7.patch |   2 +-
 ...032-disable-Apple-libc-Availability-tests.patch |   2 +-
 .../files/0033-Leopard-Default-to-fno-blocks.patch |   2 +-
 .../0034-Support-emulated-TLS-before-10.7.patch    |   2 +-
 ...g-Implement-the-using_if_exists-attribute.patch | 922 +++++++++++++++++++++
 ...-Add-parsing-support-for-C-attributes-on-.patch | 423 ++++++++++
 37 files changed, 1391 insertions(+), 49 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/Portfile b/lang/clang-11-bootstrap/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 783e1d123b2..aca6b38b9d1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -8,7 +8,7 @@ PortGroup           muniversal 1.0
</span> name                clang-11-bootstrap
 
 version             11.1.0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-revision            2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+revision            3
</span> epoch               0
 
 platforms           darwin
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -96,7 +96,9 @@ patchfiles          0001-Define-EXC_MASK_CRASH-and-MACH_EXCEPTION_CODES-if-th.pa
</span>                     0026-clang-support-macports-libstdcxx.patch \
                     0027-compiler-rt-fix-building-by-GCC.patch \
                     0028-compiler-rt-allow-to-define-required-archs.patch \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    0029-compiler-rt-atomic-which-can-be-compiled-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    0029-compiler-rt-atomic-which-can-be-compiled-by-GCC.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    0035-clang-Implement-the-using_if_exists-attribute.patch \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    0036-clang-Parse-Add-parsing-support-for-C-attributes-on-.patch
</span> 
 # sterilize MacPorts build environment; we want nothing picked up from MP prefix
 compiler.cpath
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0001-Define-EXC_MASK_CRASH-and-MACH_EXCEPTION_CODES-if-th.patch b/lang/clang-11-bootstrap/files/0001-Define-EXC_MASK_CRASH-and-MACH_EXCEPTION_CODES-if-th.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 359b61e7e21..638303be79b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0001-Define-EXC_MASK_CRASH-and-MACH_EXCEPTION_CODES-if-th.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0001-Define-EXC_MASK_CRASH-and-MACH_EXCEPTION_CODES-if-th.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From 3998ef54ce5a2d63be2a5763170a98d464d59762 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Sun, 18 Jan 2015 11:18:13 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 01/34] Define EXC_MASK_CRASH and MACH_EXCEPTION_CODES if
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- they're not defined in the SDK
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Define EXC_MASK_CRASH and MACH_EXCEPTION_CODES if they're not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ defined in the SDK
</span> 
 The 10.4 SDK does not define these macros
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0002-MacPorts-Only-Don-t-embed-the-deployment-target-in-t.patch b/lang/clang-11-bootstrap/files/0002-MacPorts-Only-Don-t-embed-the-deployment-target-in-t.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index af7a93a040b..d1d621fe8b5 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0002-MacPorts-Only-Don-t-embed-the-deployment-target-in-t.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0002-MacPorts-Only-Don-t-embed-the-deployment-target-in-t.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From 9cf659947ce441ab497be344ede8025f0f347bd2 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Sat, 17 Jan 2015 16:41:30 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 02/34] MacPorts Only: Don't embed the deployment target in the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- asm when using -fno-integrated-as
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] MacPorts Only: Don't embed the deployment target in the asm
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ when using -fno-integrated-as
</span> 
 http://llvm.org/bugs/show_bug.cgi?id=21636
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0003-Fix-build-issues-pre-Lion-due-to-missing-a-strnlen-d.patch b/lang/clang-11-bootstrap/files/0003-Fix-build-issues-pre-Lion-due-to-missing-a-strnlen-d.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 3c42e7c6304..74250aaa2bf 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0003-Fix-build-issues-pre-Lion-due-to-missing-a-strnlen-d.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0003-Fix-build-issues-pre-Lion-due-to-missing-a-strnlen-d.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,7 @@
</span> From d55a5be574088cf71a7707797e70dbf8b7ec6180 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Tue, 20 Dec 2016 12:41:21 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 03/34] Fix build issues pre-Lion due to missing a strnlen
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- definition
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fix build issues pre-Lion due to missing a strnlen definition
</span> 
 https://trac.macports.org/ticket/51520
 https://llvm.org/bugs/show_bug.cgi?id=27714
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0004-Fix-build-issues-pre-Lion-due-to-missing-a-memmem-de.patch b/lang/clang-11-bootstrap/files/0004-Fix-build-issues-pre-Lion-due-to-missing-a-memmem-de.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 099523c2288..7d97e34728b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0004-Fix-build-issues-pre-Lion-due-to-missing-a-memmem-de.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0004-Fix-build-issues-pre-Lion-due-to-missing-a-memmem-de.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,7 @@
</span> From a509cabf15ac7d231c902aa850499e144dc57eff Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 16:07:55 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 04/34] Fix build issues pre-Lion due to missing a memmem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- definition
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fix build issues pre-Lion due to missing a memmem definition
</span> 
 ---
  compiler-rt/lib/fuzzer/FuzzerUtilPosix.cpp | 34 ++++++++++++++++++++++
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0005-Threading-Only-call-pthread_setname_np-on-SnowLeopar.patch b/lang/clang-11-bootstrap/files/0005-Threading-Only-call-pthread_setname_np-on-SnowLeopar.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 392893104a8..8a20d26b51d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0005-Threading-Only-call-pthread_setname_np-on-SnowLeopar.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0005-Threading-Only-call-pthread_setname_np-on-SnowLeopar.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,7 @@
</span> From cf34a554b5fb5d3909d82bcf8d540d7c0cd434f9 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Wed, 27 Dec 2017 23:05:43 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 05/34] Threading: Only call pthread_setname_np() on
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- SnowLeopard+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Threading: Only call pthread_setname_np() on SnowLeopard+
</span> 
 Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0006-Only-call-setpriority-PRIO_DARWIN_THREAD-0-PRIO_DARW.patch b/lang/clang-11-bootstrap/files/0006-Only-call-setpriority-PRIO_DARWIN_THREAD-0-PRIO_DARW.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 1a24babdd34..3ad9253c877 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0006-Only-call-setpriority-PRIO_DARWIN_THREAD-0-PRIO_DARW.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0006-Only-call-setpriority-PRIO_DARWIN_THREAD-0-PRIO_DARW.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From f789d7d5a40bcd20d344a9a805afdaa1a82a7454 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Thu, 4 Jul 2019 13:23:19 -0700
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 06/34] Only call setpriority(PRIO_DARWIN_THREAD, 0,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- PRIO_DARWIN_BG) if it is available
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Only call setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if it is available
</span> 
 Tiger and earlier versions of darwin do not support this.
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0007-dsymutil-fix-build-on-Leopard.patch b/lang/clang-11-bootstrap/files/0007-dsymutil-fix-build-on-Leopard.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 7c8c525bdc7..c4041ab8a3c 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0007-dsymutil-fix-build-on-Leopard.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0007-dsymutil-fix-build-on-Leopard.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 44255c29f72697e7b5fb2c0d4df8305f4d9544b4 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 13:45:22 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 07/34] dsymutil: fix build on Leopard
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] dsymutil: fix build on Leopard
</span> 
 - alias `CFPropertyListCreateWithStream` to `CFPropertyListCreateFromStream`
 - add a workable definition for `uuid_string_t`
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0008-lib-Support-Unix-Path.inc-define-COPYFILE_CLONE-if-n.patch b/lang/clang-11-bootstrap/files/0008-lib-Support-Unix-Path.inc-define-COPYFILE_CLONE-if-n.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index dc914ee7933..12ab7cc5893 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0008-lib-Support-Unix-Path.inc-define-COPYFILE_CLONE-if-n.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0008-lib-Support-Unix-Path.inc-define-COPYFILE_CLONE-if-n.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,7 @@
</span> From b89fadcc31b6524f7b11af24e9feef5b9844c04c Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 13:49:38 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 08/34] lib/Support/Unix/Path.inc: define COPYFILE_CLONE if
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- needed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] lib/Support/Unix/Path.inc: define COPYFILE_CLONE if needed
</span> 
 ---
  llvm/lib/Support/Unix/Path.inc | 3 +++
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0009-MacPorts-Only-Fix-name-of-scan-view-executable-insid.patch b/lang/clang-11-bootstrap/files/0009-MacPorts-Only-Fix-name-of-scan-view-executable-insid.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 4d61aa31f53..1295eca72ff 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0009-MacPorts-Only-Fix-name-of-scan-view-executable-insid.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0009-MacPorts-Only-Fix-name-of-scan-view-executable-insid.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 1bb478c260682b6597f7b7f84ce529ef2e7be4e3 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Sat, 17 Jan 2015 17:55:27 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 09/34] MacPorts Only: Fix name of scan-view executable inside
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] MacPorts Only: Fix name of scan-view executable inside
</span>  scan-build
 
 http://trac.macports.org/ticket/35006
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0010-default-to-libcxx-on-all-systems.patch b/lang/clang-11-bootstrap/files/0010-default-to-libcxx-on-all-systems.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index bba547219b3..6286df1ae54 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0010-default-to-libcxx-on-all-systems.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0010-default-to-libcxx-on-all-systems.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 7d6818a3bb0c1f61bc8a0acab944ddb4549a9bfd Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Thu, 18 Aug 2022 02:07:11 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 10/34] default to libcxx on all systems
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] default to libcxx on all systems
</span> 
 ---
  clang/lib/Driver/ToolChains/Darwin.cpp | 4 ++--
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0011-Default-to-fragile-ObjC-runtime-when-targeting-darwi.patch b/lang/clang-11-bootstrap/files/0011-Default-to-fragile-ObjC-runtime-when-targeting-darwi.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 993d06d6b5c..961b55e6e76 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0011-Default-to-fragile-ObjC-runtime-when-targeting-darwi.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0011-Default-to-fragile-ObjC-runtime-when-targeting-darwi.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,7 @@
</span> From aaf6221d782afa8de9235678f10f95e8552c64ff Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Tue, 20 Jan 2015 00:09:16 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 11/34] Default to fragile ObjC runtime when targeting
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- darwin/ppc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Default to fragile ObjC runtime when targeting darwin/ppc
</span> 
 Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0012-Fixup-libstdc-header-search-paths-for-older-versions.patch b/lang/clang-11-bootstrap/files/0012-Fixup-libstdc-header-search-paths-for-older-versions.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 04fd0a620b0..51d57fb4782 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0012-Fixup-libstdc-header-search-paths-for-older-versions.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0012-Fixup-libstdc-header-search-paths-for-older-versions.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From a48d51f49e3186bebb143921580c1277ffe54114 Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Mon, 31 Oct 2016 15:06:36 -0700
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 12/34] Fixup libstdc++ header search paths for older versions
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- of Mac OS X
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fixup libstdc++ header search paths for older versions of Mac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ OS X
</span> 
 The subpaths were removed in Lion.  Leopard and Snow Leopard had darwin8
 symlinks for compatibility.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0013-Fix-float.h-to-work-on-Snow-Leopard-and-earlier.patch b/lang/clang-11-bootstrap/files/0013-Fix-float.h-to-work-on-Snow-Leopard-and-earlier.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index f9f54f7b292..c22def2ac55 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0013-Fix-float.h-to-work-on-Snow-Leopard-and-earlier.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0013-Fix-float.h-to-work-on-Snow-Leopard-and-earlier.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From c1a2bd1699317f16c833616863ccb2888a36084e Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Thu, 20 Jul 2017 17:15:35 -0700
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 13/34] Fix float.h to work on Snow Leopard and earlier
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fix float.h to work on Snow Leopard and earlier
</span> 
 https://bugs.llvm.org/show_bug.cgi?id=31504
 https://trac.macports.org/ticket/54135
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0014-compiler-rt-add-some-defs-missing-in-older-SDKs.patch b/lang/clang-11-bootstrap/files/0014-compiler-rt-add-some-defs-missing-in-older-SDKs.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 20d0e6391cc..90cf40e2849 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0014-compiler-rt-add-some-defs-missing-in-older-SDKs.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0014-compiler-rt-add-some-defs-missing-in-older-SDKs.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 6e5a41acb0ffc95f3a5756e4dfe25bc189a22389 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 13:57:02 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 14/34] compiler-rt: add some defs missing in older SDKs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] compiler-rt: add some defs missing in older SDKs
</span> 
 ---
  compiler-rt/lib/fuzzer/FuzzerUtilDarwin.cpp        | 8 ++++++++
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0015-10.5-and-less-compiler-rt-work-around-no-libdispatch.patch b/lang/clang-11-bootstrap/files/0015-10.5-and-less-compiler-rt-work-around-no-libdispatch.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index bed15369efe..1e0b39927b3 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0015-10.5-and-less-compiler-rt-work-around-no-libdispatch.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0015-10.5-and-less-compiler-rt-work-around-no-libdispatch.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From b4c19d923fa1fcff5c08d5bdd211997a1e4ba9a7 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 14:03:50 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 15/34] 10.5 and less: compiler-rt work around no libdispatch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- before 10.6
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] 10.5 and less: compiler-rt work around no libdispatch before
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 10.6
</span> 
 ---
  compiler-rt/lib/builtins/os_version_check.c | 13 ++++++++++++-
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0016-Fix-missing-long-long-math-prototypes-when-using-the.patch b/lang/clang-11-bootstrap/files/0016-Fix-missing-long-long-math-prototypes-when-using-the.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index d9df73ddba5..63732149de8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0016-Fix-missing-long-long-math-prototypes-when-using-the.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0016-Fix-missing-long-long-math-prototypes-when-using-the.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From fd4de49747f1528eb72b2b73319bcab5d4298c9a Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Sat, 17 Jan 2015 16:26:20 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 16/34] Fix missing long long math prototypes when using the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- Snow Leopard SDK
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Fix missing long long math prototypes when using the Snow
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Leopard SDK
</span> 
 Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0017-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch b/lang/clang-11-bootstrap/files/0017-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 4713eb5d10d..6e031e021e8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0017-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0017-implement-atomic-using-mutex-lock_guard-for-64b-ops-.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From 884ca9bc09df5859489abba1741fdb7d16cd4c7a Mon Sep 17 00:00:00 2001
 From: David Fang <fang@csl.cornell.edu>
 Date: Wed, 15 Jan 2014 21:27:34 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 17/34] implement atomic<> using mutex/lock_guard for 64b ops
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- on 32b PPC not pretty, not fast, but passes atomic tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] implement atomic<> using mutex/lock_guard for 64b ops on 32b
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ PPC not pretty, not fast, but passes atomic tests
</span> 
 ---
  libcxx/include/__atomic_locked | 240 +++++++++++++++++++++++++++++++++
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0018-libcxx-src-chrono.cpp-fix-build-by-older-SDKs.patch b/lang/clang-11-bootstrap/files/0018-libcxx-src-chrono.cpp-fix-build-by-older-SDKs.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index ff52be8a652..3e41370dff2 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0018-libcxx-src-chrono.cpp-fix-build-by-older-SDKs.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0018-libcxx-src-chrono.cpp-fix-build-by-older-SDKs.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 242d08207030270d0f3a6bf96c0d6835173bd2b1 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 14:09:22 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 18/34] libcxx/src/chrono.cpp: fix build by older SDKs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] libcxx/src/chrono.cpp: fix build by older SDKs
</span> 
 See: https://github.com/llvm/llvm-project/commit/babd3aefc9193b44ad0620a2cfd63ebb6ad7e952
 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0019-compiler-rt-allow-build-before-10.7.patch b/lang/clang-11-bootstrap/files/0019-compiler-rt-allow-build-before-10.7.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index f40f24f7bbf..cbaba3411f7 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0019-compiler-rt-allow-build-before-10.7.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0019-compiler-rt-allow-build-before-10.7.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From afe4131b6374bd5ff72a831faa58340945b6aa0a Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 14:11:06 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 19/34] compiler-rt: allow build before 10.7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] compiler-rt: allow build before 10.7
</span> 
 ---
  compiler-rt/cmake/config-ix.cmake | 3 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0020-compiler-rt-added-CMAKE_OSX_DEPLOYMENT_TARGET-fallba.patch b/lang/clang-11-bootstrap/files/0020-compiler-rt-added-CMAKE_OSX_DEPLOYMENT_TARGET-fallba.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 3d586792073..7a43ebbd036 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0020-compiler-rt-added-CMAKE_OSX_DEPLOYMENT_TARGET-fallba.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0020-compiler-rt-added-CMAKE_OSX_DEPLOYMENT_TARGET-fallba.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 0691517ced61dc1789b8efbee301f46756f7cecb Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 14:13:11 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 20/34] compiler-rt: added CMAKE_OSX_DEPLOYMENT_TARGET fallback
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] compiler-rt: added CMAKE_OSX_DEPLOYMENT_TARGET fallback
</span> 
 ---
  .../cmake/Modules/CompilerRTDarwinUtils.cmake      | 14 +++++---------
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0021-add-back-runtime-libraries-used-on-10.4-and-10.5.patch b/lang/clang-11-bootstrap/files/0021-add-back-runtime-libraries-used-on-10.4-and-10.5.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 6efe7accbf2..b3d9608cf81 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0021-add-back-runtime-libraries-used-on-10.4-and-10.5.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0021-add-back-runtime-libraries-used-on-10.4-and-10.5.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From ba3d665b91d33f808ffd39e9ee4675b72e564526 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 14:14:50 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 21/34] add back runtime libraries used on 10.4 and 10.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] add back runtime libraries used on 10.4 and 10.5
</span> 
 removed in https://github.com/llvm/llvm-project/commit/3434ade2b7ca351b61522f7da4b55070d811b83f
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0022-Don-t-look-into-sysroot-for-C-headers-if-they-are-fo.patch b/lang/clang-11-bootstrap/files/0022-Don-t-look-into-sysroot-for-C-headers-if-they-are-fo.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index ee5cec0e513..3cd38873000 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0022-Don-t-look-into-sysroot-for-C-headers-if-they-are-fo.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0022-Don-t-look-into-sysroot-for-C-headers-if-they-are-fo.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,8 +1,8 @@
</span> From b4e43cb5b9fc3ea342a37a27e3af78393575cc72 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 14:17:11 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 22/34] Don't look into <sysroot> for C++ headers if they are
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- found alongside the toolchain
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Don't look into <sysroot> for C++ headers if they are found
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ alongside the toolchain
</span> 
 Currently, Clang looks for libc++ headers alongside the installation
 directory of Clang, and it also adds a search path for headers in the
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0023-disable-DirectoryWatcher-when-builds-by-GCC.patch b/lang/clang-11-bootstrap/files/0023-disable-DirectoryWatcher-when-builds-by-GCC.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index d2ccdbc8d11..88efc5bccad 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0023-disable-DirectoryWatcher-when-builds-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0023-disable-DirectoryWatcher-when-builds-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 74dda39256362d98a74fefeddfea344b9d34b681 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:11:27 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 23/34] disable DirectoryWatcher when builds by GCC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] disable DirectoryWatcher when builds by GCC
</span> 
 ---
  clang/lib/DirectoryWatcher/CMakeLists.txt | 2 +-
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0024-Use-for-long-options-in-help-text.patch b/lang/clang-11-bootstrap/files/0024-Use-for-long-options-in-help-text.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index cf4f9e6339e..753cdaecb9b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0024-Use-for-long-options-in-help-text.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0024-Use-for-long-options-in-help-text.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 453bcd6038730cf1da7d9b988574513cadb99cf1 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:14:31 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 24/34] Use "--" for long options in --help text
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Use "--" for long options in --help text
</span> 
 See: https://reviews.llvm.org/D92310
 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0025-compatibility-with-xar-on-macOS-10.5.patch b/lang/clang-11-bootstrap/files/0025-compatibility-with-xar-on-macOS-10.5.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 5888dc44f90..1abfa1a9881 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0025-compatibility-with-xar-on-macOS-10.5.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0025-compatibility-with-xar-on-macOS-10.5.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 5deccc8875fb46daeba4b674f187ed81f93005da Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:22:09 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 25/34] compatibility with xar on macOS 10.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] compatibility with xar on macOS 10.5
</span> 
 macOS 10.5 uses very old xar which has `xar_open` but misses
 `xar_extract_tobuffersz`, update the check for `check_library_exists`.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0026-clang-support-macports-libstdcxx.patch b/lang/clang-11-bootstrap/files/0026-clang-support-macports-libstdcxx.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 862745d1f88..3459392b2bc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0026-clang-support-macports-libstdcxx.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0026-clang-support-macports-libstdcxx.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 250ee3cf3ee96307c494b62e93b93b9b63ec4db2 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Thu, 18 Aug 2022 02:31:25 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 26/34] [clang] support macports-libstdcxx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [clang] support macports-libstdcxx
</span> 
 ---
  clang/include/clang/Driver/ToolChain.h  |  1 +
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0027-compiler-rt-fix-building-by-GCC.patch b/lang/clang-11-bootstrap/files/0027-compiler-rt-fix-building-by-GCC.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 0fee504d83f..6e97a716ac9 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0027-compiler-rt-fix-building-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0027-compiler-rt-fix-building-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 1cd1b67b0ba87471304b046649316d466c5364bc Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 16:08:45 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 27/34] [compiler-rt] fix building by GCC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [compiler-rt] fix building by GCC
</span> 
 ---
  compiler-rt/cmake/config-ix.cmake | 15 ++++++++++-----
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0028-compiler-rt-allow-to-define-required-archs.patch b/lang/clang-11-bootstrap/files/0028-compiler-rt-allow-to-define-required-archs.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 09444ba3586..1fc53d1fc95 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0028-compiler-rt-allow-to-define-required-archs.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0028-compiler-rt-allow-to-define-required-archs.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 60cd288acdf48e3cd3f19eccf776e8fe23fcc04f Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 16:09:26 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 28/34] [compiler-rt] allow to define required archs
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [compiler-rt] allow to define required archs
</span> 
 ---
  compiler-rt/cmake/builtin-config-ix.cmake | 18 ++++++++++--------
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0029-compiler-rt-atomic-which-can-be-compiled-by-GCC.patch b/lang/clang-11-bootstrap/files/0029-compiler-rt-atomic-which-can-be-compiled-by-GCC.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index eda37093c47..e55310fcf04 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0029-compiler-rt-atomic-which-can-be-compiled-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0029-compiler-rt-atomic-which-can-be-compiled-by-GCC.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From ac23587c43ba957f530de1c4b2214ea1aaae39d6 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Thu, 18 Aug 2022 00:14:22 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 29/34] [compiler-rt] atomic which can be compiled by GCC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [compiler-rt] atomic which can be compiled by GCC
</span> 
 ---
  compiler-rt/lib/builtins/atomic.c             | 109 ++++++++++++++++++
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0030-fix-building-on-10.10-by-GCC-10.patch b/lang/clang-11-bootstrap/files/0030-fix-building-on-10.10-by-GCC-10.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 97809ebe059..96f9149f3ac 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0030-fix-building-on-10.10-by-GCC-10.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0030-fix-building-on-10.10-by-GCC-10.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 7bcddfb1ac8f9786f02b0313304e0c595f369b22 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:23:05 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 30/34] fix building on 10.10 by GCC 10
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] fix building on 10.10 by GCC 10
</span> 
 macOS 10.10 Yosemite defines `dispatch_block_t` on the way that it can
 be compiled by gcc 10; redefine in properly.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0031-fix-build-of-shared-libc-.dylib-on-10.7.patch b/lang/clang-11-bootstrap/files/0031-fix-build-of-shared-libc-.dylib-on-10.7.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 86472afbeed..8f96ebb073b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0031-fix-build-of-shared-libc-.dylib-on-10.7.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0031-fix-build-of-shared-libc-.dylib-on-10.7.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 2619c3115f82a504540780ff29d5c932007d7ac3 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:27:16 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 31/34] fix build of shared libc++.dylib on < 10.7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] fix build of shared libc++.dylib on < 10.7
</span> 
 reexported_symbols_list is not accepted on < 10.7
 but reexport_library is, and that is what was used previously
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0032-disable-Apple-libc-Availability-tests.patch b/lang/clang-11-bootstrap/files/0032-disable-Apple-libc-Availability-tests.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index cdb749d65ef..da314c6a248 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0032-disable-Apple-libc-Availability-tests.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0032-disable-Apple-libc-Availability-tests.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 2bcfad170970fa3d0b668c0d904f9767e115cdfe Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:27:50 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 32/34] disable Apple libc++ Availability tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] disable Apple libc++ Availability tests
</span> 
 if we are using MacPort's installed libc++
 then Apple's availablilty tests for libcxx by OS version
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0033-Leopard-Default-to-fno-blocks.patch b/lang/clang-11-bootstrap/files/0033-Leopard-Default-to-fno-blocks.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index 75f9a17b593..685f055f34d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0033-Leopard-Default-to-fno-blocks.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0033-Leopard-Default-to-fno-blocks.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From ce1e4345f85cffe8a7a3359c6fa2ba711e88e0dc Mon Sep 17 00:00:00 2001
 From: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 Date: Wed, 7 Jan 2015 03:42:15 -0800
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 33/34] Leopard: Default to -fno-blocks
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Leopard: Default to -fno-blocks
</span> 
 Signed-off-by: Jeremy Huddleston Sequoia <jeremyhu@apple.com>
 ---
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0034-Support-emulated-TLS-before-10.7.patch b/lang/clang-11-bootstrap/files/0034-Support-emulated-TLS-before-10.7.patch
</span><span style='display:block; white-space:pre;color:#808080;'>index ce5b9171398..479579fafdc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/clang-11-bootstrap/files/0034-Support-emulated-TLS-before-10.7.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0034-Support-emulated-TLS-before-10.7.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,7 +1,7 @@
</span> From 1c2e45c471d804f4bd53d833239bdeb7d9992668 Mon Sep 17 00:00:00 2001
 From: "Kirill A. Korinsky" <kirill@korins.ky>
 Date: Wed, 17 Aug 2022 15:30:28 +0200
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Subject: [PATCH 34/34] Support emulated TLS before 10.7
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] Support emulated TLS before 10.7
</span> 
 ---
  clang/lib/Basic/Targets/OSTargets.h | 2 +-
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0035-clang-Implement-the-using_if_exists-attribute.patch b/lang/clang-11-bootstrap/files/0035-clang-Implement-the-using_if_exists-attribute.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..efdffdb7507
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0035-clang-Implement-the-using_if_exists-attribute.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,922 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From 7f47b12289d44de089feb7fcb80c9412b3138ec5 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 30 Aug 2022 14:34:44 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [clang] Implement the using_if_exists attribute
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Backport from https://reviews.llvm.org/D90188
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/AST/DeclCXX.h             |  22 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/AST/RecursiveASTVisitor.h |   2 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/Basic/Attr.td             |   8 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/Basic/AttrDocs.td         |  25 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/Basic/DeclNodes.td        |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .../clang/Basic/DiagnosticSemaKinds.td        |   6 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/Sema/Sema.h               |  13 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .../include/clang/Serialization/ASTBitCodes.h |   3 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/AST/DeclBase.cpp                    |   3 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/AST/DeclCXX.cpp                     |  19 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/CodeGen/CGDecl.cpp                  |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/SemaDecl.cpp                   |  23 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/SemaDeclAttr.cpp               |   4 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/SemaDeclCXX.cpp                |  47 +++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/SemaExpr.cpp                   |  16 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .../lib/Sema/SemaTemplateInstantiateDecl.cpp  |  24 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/TreeTransform.h                |   6 +-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Serialization/ASTCommon.cpp         |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Serialization/ASTReaderDecl.cpp     |   9 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Serialization/ASTWriterDecl.cpp     |   7 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/test/Parser/using-if-exists-attr.cpp    |  27 +++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/test/SemaCXX/attr-deprecated.cpp        |  12 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/test/SemaCXX/using-if-exists.cpp        | 226 ++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/tools/libclang/CIndex.cpp               |   1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 24 files changed, 480 insertions(+), 26 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 clang/test/Parser/using-if-exists-attr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 clang/test/SemaCXX/using-if-exists.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/AST/DeclCXX.h b/clang/include/clang/AST/DeclCXX.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 2b8d7e879a0a..266c6c1d3f51 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/AST/DeclCXX.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/AST/DeclCXX.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3788,6 +3788,28 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   static bool classofKind(Kind K) { return K == UnresolvedUsingTypename; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// This node is generated when a using-declaration that was annotated with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// __attribute__((using_if_exists)) failed to resolve to a known declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// In that case, Sema builds a UsingShadowDecl whose target is an instance of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// this declaration, adding it to the current scope. Referring to this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/// declaration in any way is an error.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++class UnresolvedUsingIfExistsDecl final : public NamedDecl {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  UnresolvedUsingIfExistsDecl(DeclContext *DC, SourceLocation Loc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              DeclarationName Name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  void anchor() override;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static UnresolvedUsingIfExistsDecl *Create(ASTContext &Ctx, DeclContext *DC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             SourceLocation Loc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                             DeclarationName Name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static UnresolvedUsingIfExistsDecl *CreateDeserialized(ASTContext &Ctx,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                         unsigned ID);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static bool classof(const Decl *D) { return classofKind(D->getKind()); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  static bool classofKind(Kind K) { return K == Decl::UnresolvedUsingIfExists; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /// Represents a C++11 static_assert declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ class StaticAssertDecl : public Decl {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   llvm::PointerIntPair<Expr *, 1, bool> AssertExprAndFailed;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3dcfc9fee629..2c04eae7c03e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/AST/RecursiveASTVisitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/AST/RecursiveASTVisitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1816,6 +1816,8 @@ DEF_TRAVERSE_DECL(UnresolvedUsingTypenameDecl, {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // source.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ })
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++DEF_TRAVERSE_DECL(UnresolvedUsingIfExistsDecl, {})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ DEF_TRAVERSE_DECL(EnumDecl, {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   TRY_TO(TraverseDeclTemplateParameterLists(D));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/Attr.td b/clang/include/clang/Basic/Attr.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 60eaee7839e2..1bc86e43b6e6 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/Attr.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/Attr.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3421,6 +3421,14 @@ def NoBuiltin : Attr {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   let Documentation = [NoBuiltinDocs];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def UsingIfExists : InheritableAttr {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  let Spellings = [Clang<"using_if_exists", 0>];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  let Subjects = SubjectList<[Using,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              UnresolvedUsingTypename,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                              UnresolvedUsingValue], ErrorDiag>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  let Documentation = [UsingIfExistsDocs];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // FIXME: This attribute is not inheritable, it will not be propagated to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // redecls. [[clang::lifetimebound]] has the same problems. This should be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // fixed in TableGen (by probably adding a new inheritable flag).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/AttrDocs.td b/clang/include/clang/Basic/AttrDocs.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 833127ed44eb..46929ce49599 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/AttrDocs.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/AttrDocs.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -4820,6 +4820,31 @@ once.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def UsingIfExistsDocs : Documentation {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  let Category = DocCatDecl;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  let Content = [{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The ``using_if_exists`` attribute applies to a using-declaration. It allows
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++programmers to import a declaration that potentially does not exist, instead
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++deferring any errors to the point of use. For instance:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.. code-block:: c++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  namespace empty_namespace {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  __attribute__((using_if_exists))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using empty_namespace::does_not_exist; // no error!
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  does_not_exist x; // error: use of unresolved 'using_if_exists'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The C++ spelling of the attribte (`[[clang::using_if_exists]]`) is also
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++supported as a clang extension, since ISO C++ doesn't support attributes in this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++position. If the entity referred to by the using-declaration is found by name
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++lookup, the attribute has no effect. This attribute is useful for libraries
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++(primarily, libc++) that wish to redeclare a set of declarations in another
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace, when the availability of those declarations is difficult or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++impossible to detect at compile time with the preprocessor.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def HandleDocs : DocumentationCategory<"Handle Attributes"> {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   let Content = [{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Handles are a way to identify resources like files, sockets, and processes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/DeclNodes.td b/clang/include/clang/Basic/DeclNodes.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 866988ee3f01..c7d3f513b7d5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/DeclNodes.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/DeclNodes.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -74,6 +74,7 @@ def Named : DeclNode<Decl, "named declarations", 1>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   def UsingPack : DeclNode<Named>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   def UsingShadow : DeclNode<Named>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def ConstructorUsingShadow : DeclNode<UsingShadow>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  def UnresolvedUsingIfExists : DeclNode<Named>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   def ObjCMethod : DeclNode<Named, "Objective-C methods">, DeclContext;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   def ObjCContainer : DeclNode<Named, "Objective-C containers", 1>, DeclContext;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     def ObjCCategory : DeclNode<ObjCContainer>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 941f2cafc372..0581296ac802 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -548,6 +548,12 @@ def err_using_decl_conflict_reverse : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def note_using_decl : Note<"%select{|previous }0using declaration">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_using_decl_redeclaration_expansion : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "using declaration pack expansion at block scope produces multiple values">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def err_use_of_empty_using_if_exists : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "reference to unresolved using declaration">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def note_empty_using_if_exists_here : Note<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "using declaration annotated with 'using_if_exists' here">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def err_using_if_exists_on_ctor : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "'using_if_exists' attribute cannot be applied to an inheriting constructor">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def warn_access_decl_deprecated : Warning<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "access declarations are deprecated; use using declarations instead">,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 16a7084f6b08..89d7730d2420 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Sema/Sema.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Sema/Sema.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -5399,11 +5399,14 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                const DeclarationNameInfo &NameInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                SourceLocation NameLoc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  NamedDecl *BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      Scope *S, AccessSpecifier AS, SourceLocation UsingLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      const ParsedAttributesView &AttrList, bool IsInstantiation);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  NamedDecl *BuildUsingDeclaration(Scope *S, AccessSpecifier AS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   SourceLocation UsingLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   bool HasTypenameKeyword,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   SourceLocation TypenameLoc, CXXScopeSpec &SS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   DeclarationNameInfo NameInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   SourceLocation EllipsisLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   const ParsedAttributesView &AttrList,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                   bool IsInstantiation, bool IsUsingIfExists);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   NamedDecl *BuildUsingPackDecl(NamedDecl *InstantiatedFrom,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                 ArrayRef<NamedDecl *> Expansions);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c6f9f1d1a08f..737023e7d1dc 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Serialization/ASTBitCodes.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Serialization/ASTBitCodes.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1423,6 +1423,9 @@ public:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       /// \brief A ConceptDecl record.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       DECL_CONCEPT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      /// An UnresolvedUsingIfExistsDecl record.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      DECL_UNRESOLVED_USING_IF_EXISTS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       /// \brief A StaticAssertDecl record.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       DECL_STATIC_ASSERT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/AST/DeclBase.cpp b/clang/lib/AST/DeclBase.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f4314d0bd961..7e5ace6c111b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/AST/DeclBase.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/AST/DeclBase.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -812,6 +812,9 @@ unsigned Decl::getIdentifierNamespaceForKind(Kind DeclKind) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case TypeAliasTemplate:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return IDNS_Ordinary | IDNS_Tag | IDNS_Type;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case UnresolvedUsingIfExists:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return IDNS_Type | IDNS_Ordinary;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     case OMPDeclareReduction:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return IDNS_OMPReduction;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/AST/DeclCXX.cpp b/clang/lib/AST/DeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6f1fd2f14ede..e7fa4849063f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/AST/DeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/AST/DeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3085,6 +3085,25 @@ UnresolvedUsingTypenameDecl::CreateDeserialized(ASTContext &C, unsigned ID) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       SourceLocation(), nullptr, SourceLocation());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++UnresolvedUsingIfExistsDecl *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++UnresolvedUsingIfExistsDecl::Create(ASTContext &Ctx, DeclContext *DC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                    SourceLocation Loc, DeclarationName Name) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return new (Ctx, DC) UnresolvedUsingIfExistsDecl(DC, Loc, Name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++UnresolvedUsingIfExistsDecl *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++UnresolvedUsingIfExistsDecl::CreateDeserialized(ASTContext &Ctx, unsigned ID) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return new (Ctx, ID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      UnresolvedUsingIfExistsDecl(nullptr, SourceLocation(), DeclarationName());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++UnresolvedUsingIfExistsDecl::UnresolvedUsingIfExistsDecl(DeclContext *DC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                         SourceLocation Loc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                         DeclarationName Name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    : NamedDecl(Decl::UnresolvedUsingIfExists, DC, Loc, Name) {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void UnresolvedUsingIfExistsDecl::anchor() {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void StaticAssertDecl::anchor() {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ StaticAssertDecl *StaticAssertDecl::Create(ASTContext &C, DeclContext *DC,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/CodeGen/CGDecl.cpp b/clang/lib/CodeGen/CGDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1729c7ed3c31..d149756c3f48 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/CodeGen/CGDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/CodeGen/CGDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -99,6 +99,7 @@ void CodeGenFunction::EmitDecl(const Decl &D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::ConstructorUsingShadow:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::ObjCTypeParam:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::Binding:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case Decl::UnresolvedUsingIfExists:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     llvm_unreachable("Declaration should not be in declstmts!");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::Function:  // void X();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::Record:    // struct/union/class X;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5b0417fa8859..1de95feb0f25 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -434,12 +434,14 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Look to see if we have a type anywhere in the list of results.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     for (LookupResult::iterator Res = Result.begin(), ResEnd = Result.end();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+          Res != ResEnd; ++Res) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      if (isa<TypeDecl>(*Res) || isa<ObjCInterfaceDecl>(*Res) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          (AllowDeducedTemplate && getAsTypeTemplateDecl(*Res))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      NamedDecl *RealRes = (*Res)->getUnderlyingDecl();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (isa<TypeDecl, ObjCInterfaceDecl, UnresolvedUsingIfExistsDecl>(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              RealRes) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          (AllowDeducedTemplate && getAsTypeTemplateDecl(RealRes))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         if (!IIDecl ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            (*Res)->getLocation().getRawEncoding() <
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              IIDecl->getLocation().getRawEncoding())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-          IIDecl = *Res;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            // Make the selection of the recovery decl deterministic.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            RealRes->getLocation() < IIDecl->getLocation())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          IIDecl = RealRes;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -488,6 +490,10 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     (void)DiagnoseUseOfDecl(IDecl, NameLoc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!HasTrailingDot)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       T = Context.getObjCInterfaceType(IDecl);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  } else if (auto *UD = dyn_cast<UnresolvedUsingIfExistsDecl>(IIDecl)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (void)DiagnoseUseOfDecl(UD, NameLoc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Recover with 'int'
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    T = Context.IntTy;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   } else if (AllowDeducedTemplate) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (auto *TD = getAsTypeTemplateDecl(IIDecl))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       T = Context.getDeducedTemplateSpecializationType(TemplateName(TD),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -504,7 +510,7 @@ ParsedType Sema::getTypeName(const IdentifierInfo &II, SourceLocation NameLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // constructor or destructor name (in such a case, the scope specifier
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // will be attached to the enclosing Expr or Decl node).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (SS && SS->isNotEmpty() && !IsCtorOrDtorName &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      !isa<ObjCInterfaceDecl>(IIDecl)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      !isa<ObjCInterfaceDecl, UnresolvedUsingIfExistsDecl>(IIDecl)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (WantNontrivialTypeSourceInfo) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // Construct a type with type-source information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       TypeLocBuilder Builder;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1163,6 +1169,11 @@ Corrected:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return NameClassification::Concept(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         TemplateName(cast<TemplateDecl>(FirstDecl)));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(FirstDecl)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (void)DiagnoseUseOfDecl(EmptyD, NameLoc);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return NameClassification::Error();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // We can have a type template here if we're classifying a template argument.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (isa<TemplateDecl>(FirstDecl) && !isa<FunctionTemplateDecl>(FirstDecl) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       !isa<VarTemplateDecl>(FirstDecl))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a9a2a19b4797..3cff1937e221 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaDeclAttr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaDeclAttr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -7450,6 +7450,10 @@ static void ProcessDeclAttribute(Sema &S, Scope *scope, Decl *D,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case ParsedAttr::AT_UseHandle:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     handleHandleAttr<UseHandleAttr>(S, D, AL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case ParsedAttr::AT_UsingIfExists:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    handleSimpleAttribute<UsingIfExistsAttr>(S, D, AL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 22bf35dbd0cb..710fe3bce6ef 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11495,10 +11495,11 @@ Decl *Sema::ActOnUsingDeclaration(Scope *S, AccessSpecifier AS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  NamedDecl *UD =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      BuildUsingDeclaration(S, AS, UsingLoc, TypenameLoc.isValid(), TypenameLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            SS, TargetNameInfo, EllipsisLoc, AttrList,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                            /*IsInstantiation*/false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  NamedDecl *UD = BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      S, AS, UsingLoc, TypenameLoc.isValid(), TypenameLoc, SS, TargetNameInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      EllipsisLoc, AttrList,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      /*IsInstantiation=*/false,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      AttrList.hasAttribute(ParsedAttr::AT_UsingIfExists));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (UD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     PushOnScopeChains(UD, S, /*AddToContext*/ false);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11518,6 +11519,12 @@ IsEquivalentForUsingDecl(ASTContext &Context, NamedDecl *D1, NamedDecl *D2) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return Context.hasSameType(TD1->getUnderlyingType(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                  TD2->getUnderlyingType());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Two using_if_exists using-declarations are equivalent if both are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // unresolved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (isa<UnresolvedUsingIfExistsDecl>(D1) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      isa<UnresolvedUsingIfExistsDecl>(D2))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11628,6 +11635,20 @@ bool Sema::CheckUsingShadowDecl(UsingDecl *Using, NamedDecl *Orig,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (FoundEquivalentDecl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Always emit a diagnostic for a mismatch between an unresolved
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // using_if_exists and a resolved using declaration in either direction.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (isa<UnresolvedUsingIfExistsDecl>(Target) !=
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!NonTag && !Tag)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag(Using->getLocation(), diag::err_using_decl_conflict);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag(Target->getLocation(), diag::note_using_decl_target);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag((NonTag ? NonTag : Tag)->getLocation(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++         diag::note_using_decl_conflict);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Using->setInvalidDecl();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (FunctionDecl *FD = Target->getAsFunction()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     NamedDecl *OldDecl = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     switch (CheckOverload(nullptr, FD, Previous, OldDecl,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11892,7 +11913,8 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Scope *S, AccessSpecifier AS, SourceLocation UsingLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     bool HasTypenameKeyword, SourceLocation TypenameLoc, CXXScopeSpec &SS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     DeclarationNameInfo NameInfo, SourceLocation EllipsisLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    const ParsedAttributesView &AttrList, bool IsInstantiation) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    const ParsedAttributesView &AttrList, bool IsInstantiation,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    bool IsUsingIfExists) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   assert(!SS.isInvalid() && "Invalid CXXScopeSpec.");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SourceLocation IdentLoc = NameInfo.getLoc();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   assert(IdentLoc.isValid() && "Invalid TargetName location.");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11961,6 +11983,13 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                               IdentLoc))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // 'using_if_exists' doesn't make sense on an inherited constructor.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (IsUsingIfExists && UsingName.getName().getNameKind() ==
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                             DeclarationName::CXXConstructorName) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag(UsingLoc, diag::err_using_if_exists_on_ctor);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   DeclContext *LookupContext = computeDeclContext(SS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   NamedDecl *D;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12015,6 +12044,11 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   LookupQualifiedName(R, LookupContext);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (R.empty() && IsUsingIfExists)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    R.addDecl(UnresolvedUsingIfExistsDecl::Create(Context, CurContext, UsingLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                                  UsingName.getName()),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++              AS_public);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Try to correct typos if possible. If constructor name lookup finds no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // results, that means the named class has no explicit constructors, and we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // suppressed declaring implicit ones (probably because it's dependent or
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12089,7 +12123,8 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (HasTypenameKeyword) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // If we asked for a typename and got a non-type decl, error out.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (!R.getAsSingle<TypeDecl>()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (!R.getAsSingle<TypeDecl>() &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        !R.getAsSingle<UnresolvedUsingIfExistsDecl>()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Diag(IdentLoc, diag::err_using_typename_non_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       for (LookupResult::iterator I = R.begin(), E = R.end(); I != E; ++I)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         Diag((*I)->getUnderlyingDecl()->getLocation(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index d301e6c732ab..807e5e33dd45 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaExpr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaExpr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -82,6 +82,9 @@ bool Sema::CanUseDecl(NamedDecl *D, bool TreatUnavailableAsInvalid) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       cast<Decl>(CurContext)->getAvailability() != AR_Unavailable)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (isa<UnresolvedUsingIfExistsDecl>(D))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -348,6 +351,12 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl *D, ArrayRef<SourceLocation> Locs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (const auto *EmptyD = dyn_cast<UnresolvedUsingIfExistsDecl>(D)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag(Loc, diag::err_use_of_empty_using_if_exists);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag(EmptyD->getLocation(), diag::note_empty_using_if_exists_here);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   DiagnoseAvailabilityOfDecl(D, Locs, UnknownObjCClass, ObjCPropertyAccess,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                              AvoidPartialAvailabilityChecks, ClassReceiver);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3123,8 +3132,7 @@ ExprResult Sema::BuildDeclarationNameExpr(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Make sure that we're referring to a value.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ValueDecl *VD = dyn_cast<ValueDecl>(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (!VD) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (!isa<ValueDecl, UnresolvedUsingIfExistsDecl>(D)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Diag(Loc, diag::err_ref_non_value)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       << D << SS.getRange();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Diag(D->getLocation(), diag::note_declared_at);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3135,9 +3143,11 @@ ExprResult Sema::BuildDeclarationNameExpr(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // this check when we're going to perform argument-dependent lookup
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // on this function name, because this might not be the function
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // that overload resolution actually selects.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (DiagnoseUseOfDecl(VD, Loc))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (DiagnoseUseOfDecl(D, Loc))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return ExprError();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  auto *VD = cast<ValueDecl>(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Only create DeclRefExpr's for valid Decl's.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (VD->isInvalidDecl() && !AcceptInvalidDecl)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return ExprError();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7e6efe6105bf..248b8293eb41 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaTemplateInstantiateDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3000,9 +3000,15 @@ Decl *TemplateDeclInstantiator::VisitUsingDecl(UsingDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       if (auto *BaseShadow = CUSD->getNominatedBaseClassShadowDecl())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         OldTarget = BaseShadow;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    NamedDecl *InstTarget =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-            Shadow->getLocation(), OldTarget, TemplateArgs));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NamedDecl *InstTarget = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (auto *EmptyD =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++            dyn_cast<UnresolvedUsingIfExistsDecl>(Shadow->getTargetDecl())) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      InstTarget = UnresolvedUsingIfExistsDecl::Create(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          SemaRef.Context, Owner, EmptyD->getLocation(), EmptyD->getDeclName());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      InstTarget = cast_or_null<NamedDecl>(SemaRef.FindInstantiatedDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          Shadow->getLocation(), OldTarget, TemplateArgs));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!InstTarget)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3125,13 +3131,16 @@ Decl *TemplateDeclInstantiator::instantiateUnresolvedUsingDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SourceLocation EllipsisLoc =
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       InstantiatingSlice ? SourceLocation() : D->getEllipsisLoc();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  bool IsUsingIfExists = D->template hasAttr<UsingIfExistsAttr>();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   NamedDecl *UD = SemaRef.BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       /*Scope*/ nullptr, D->getAccess(), D->getUsingLoc(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       /*HasTypename*/ TD, TypenameLoc, SS, NameInfo, EllipsisLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       ParsedAttributesView(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      /*IsInstantiation*/ true);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (UD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      /*IsInstantiation*/ true, IsUsingIfExists);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (UD) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    SemaRef.InstantiateAttrs(TemplateArgs, D, UD);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     SemaRef.Context.setInstantiatedFromUsingDecl(UD, D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return UD;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3146,6 +3155,11 @@ Decl *TemplateDeclInstantiator::VisitUnresolvedUsingValueDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return instantiateUnresolvedUsingDecl(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Decl *TemplateDeclInstantiator::VisitUnresolvedUsingIfExistsDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    UnresolvedUsingIfExistsDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  llvm_unreachable("referring to unresolved decl out of UsingShadowDecl");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Decl *TemplateDeclInstantiator::VisitUsingPackDecl(UsingPackDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SmallVector<NamedDecl*, 8> Expansions;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (auto *UD : D->expansions()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ae0e9f1119b4..091be27e3d17 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/TreeTransform.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/TreeTransform.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -14052,7 +14052,11 @@ QualType TreeTransform<Derived>::RebuildUnresolvedUsingType(SourceLocation Loc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // A valid resolved using typename decl points to exactly one type decl.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert(++Using->shadow_begin() == Using->shadow_end());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    Ty = cast<TypeDecl>((*Using->shadow_begin())->getTargetDecl());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NamedDecl *Target = Using->shadow_begin()->getTargetDecl();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (SemaRef.DiagnoseUseOfDecl(Target, Loc))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return QualType();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Ty = cast<TypeDecl>(Target);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     assert(isa<UnresolvedUsingTypenameDecl>(D) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            "UnresolvedUsingTypenameDecl transformed to non-using decl");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Serialization/ASTCommon.cpp b/clang/lib/Serialization/ASTCommon.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bf583b02f96b..165d96fd4d85 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Serialization/ASTCommon.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Serialization/ASTCommon.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -416,6 +416,7 @@ bool serialization::isRedeclarableDeclKind(unsigned Kind) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::Concept:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::LifetimeExtendedTemporary:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::RequiresExprBody:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case Decl::UnresolvedUsingIfExists:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // These indirectly derive from Redeclarable<T> but are not actually
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c0bf240464f7..c2390403900c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Serialization/ASTReaderDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Serialization/ASTReaderDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -325,6 +325,7 @@ namespace clang {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitTypedefDecl(TypedefDecl *TD);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitTypeAliasDecl(TypeAliasDecl *TD);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     RedeclarableResult VisitTagDecl(TagDecl *TD);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitEnumDecl(EnumDecl *ED);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     RedeclarableResult VisitRecordDeclImpl(RecordDecl *RD);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1689,6 +1690,11 @@ void ASTDeclReader::VisitUnresolvedUsingTypenameDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   mergeMergeable(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void ASTDeclReader::VisitUnresolvedUsingIfExistsDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    UnresolvedUsingIfExistsDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  VisitNamedDecl(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void ASTDeclReader::ReadCXXDefinitionData(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     struct CXXRecordDecl::DefinitionData &Data, const CXXRecordDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #define FIELD(Name, Width, Merge) \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3841,6 +3847,9 @@ Decl *ASTReader::ReadDeclRecord(DeclID ID) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case DECL_UNRESOLVED_USING_TYPENAME:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     D = UnresolvedUsingTypenameDecl::CreateDeserialized(Context, ID);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case DECL_UNRESOLVED_USING_IF_EXISTS:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    D = UnresolvedUsingIfExistsDecl::CreateDeserialized(Context, ID);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case DECL_CXX_RECORD:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     D = CXXRecordDecl::CreateDeserialized(Context, ID);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index eecdf89c791a..7b65fdd7eb8d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Serialization/ASTWriterDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Serialization/ASTWriterDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -69,6 +69,7 @@ namespace clang {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitTypedefDecl(TypedefDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitTypeAliasDecl(TypeAliasDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitUnresolvedUsingTypenameDecl(UnresolvedUsingTypenameDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    void VisitUnresolvedUsingIfExistsDecl(UnresolvedUsingIfExistsDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitTagDecl(TagDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitEnumDecl(EnumDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     void VisitRecordDecl(RecordDecl *D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1337,6 +1338,12 @@ void ASTDeclWriter::VisitUnresolvedUsingTypenameDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Code = serialization::DECL_UNRESOLVED_USING_TYPENAME;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void ASTDeclWriter::VisitUnresolvedUsingIfExistsDecl(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    UnresolvedUsingIfExistsDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  VisitNamedDecl(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Code = serialization::DECL_UNRESOLVED_USING_IF_EXISTS;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   VisitRecordDecl(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/test/Parser/using-if-exists-attr.cpp b/clang/test/Parser/using-if-exists-attr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000000..ba34b9beb6bc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/test/Parser/using-if-exists-attr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,27 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// RUN: %clang_cc1 -std=c++20 -fsyntax-only %s -pedantic -verify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define UIE __attribute__((using_if_exists))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef int x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x __attribute__((using_if_exists));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x [[clang::using_if_exists]]; // expected-warning{{ISO C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[clang::using_if_exists]] // expected-warning{{ISO C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::not_there,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NS::not_there2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::not_there3,                          // expected-error {{no member named 'not_there3' in namespace 'NS'}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NS::not_there4 [[clang::using_if_exists]]; // expected-warning{{C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[clang::using_if_exists]] using NS::not_there5 [[clang::using_if_exists]]; // expected-warning 2 {{ISO C++ does not allow}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct Base {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct Derived : Base {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[clang::using_if_exists]] using Base::x;          // expected-warning {{ISO C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using Base::y [[clang::using_if_exists]];          // expected-warning {{ISO C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[clang::using_if_exists]] using Base::z, Base::q; // expected-warning {{C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/test/SemaCXX/attr-deprecated.cpp b/clang/test/SemaCXX/attr-deprecated.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5ba55f0c23b5..5c427ad8fef1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/test/SemaCXX/attr-deprecated.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/test/SemaCXX/attr-deprecated.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -256,3 +256,15 @@ typedef struct TDS {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } TDS __attribute__((deprecated)); // expected-note {{'TDS' has been explicitly marked deprecated here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ TDS tds; // expected-warning {{'TDS' is deprecated}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct TDS tds2; // no warning, attribute only applies to the typedef.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test8 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct A {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // expected-note@+1 {{'B' has been explicitly marked deprecated here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  struct __attribute__((deprecated)) B {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <typename T> struct D : T {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using typename T::B;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  B b; // expected-warning {{'B' is deprecated}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++D<A> da; // expected-note {{in instantiation of template class}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test8
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/test/SemaCXX/using-if-exists.cpp b/clang/test/SemaCXX/using-if-exists.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000000..36fbbb171fb9
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/test/SemaCXX/using-if-exists.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,226 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// RUN: %clang_cc1 -std=c++20 -fsyntax-only %s -verify
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define UIE __attribute__((using_if_exists))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_basic {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x UIE; // expected-note{{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++x usex();        // expected-error{{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NotNS::x UIE; // expected-error{{use of undeclared identifier 'NotNS'}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::NotNS::x UIE; // expected-error{{no member named 'NotNS' in namespace 'test_basic::NS'}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_basic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_redecl {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS1 {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS2 {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS3 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int A();     // expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct B {}; // expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int C();     // expected-note{{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct D {}; // expected-note{{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace NS3
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS1::A UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS2::A UIE; // expected-note{{using declaration annotated with 'using_if_exists' here}} expected-note{{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS3::A UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int i = A();      // expected-error{{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS1::B UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS2::B UIE; // expected-note{{conflicting declaration}} expected-note{{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS3::B UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++B myB;            // expected-error{{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS3::C UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS2::C UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int j = C();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS3::D UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS2::D UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++D myD;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_redecl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_dependent {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class B>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct S : B {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using B::mf UIE;          // expected-note 3 {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using typename B::mt UIE; // expected-note{{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct BaseEmpty {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct BaseNonEmpty {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  void mf();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  typedef int mt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class Base>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct UseCtor : Base {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using Base::Base UIE; // expected-error{{'using_if_exists' attribute cannot be applied to an inheriting constructor}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct BaseCtor {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void f() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  S<BaseEmpty> empty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  S<BaseNonEmpty> nonempty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  empty.mf(); // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  nonempty.mf();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  (&empty)->mf(); // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  (&nonempty)->mf();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  S<BaseEmpty>::mt y; // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  S<BaseNonEmpty>::mt z;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  S<BaseEmpty>::mf(); // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  UseCtor<BaseCtor> usector;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class B>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct Implicit : B {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using B::mf UIE;          // expected-note {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using typename B::mt UIE; // expected-note 2 {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  void use() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    mf(); // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    mt x; // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  mt alsoUse(); // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void testImplicit() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Implicit<BaseNonEmpty> nonempty;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  Implicit<BaseEmpty> empty; // expected-note {{in instantiation}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  nonempty.use();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  empty.use(); // expected-note {{in instantiation}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct NonDep : BaseEmpty {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using BaseEmpty::x UIE; // expected-note{{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  x y();                  // expected-error{{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_dependent
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_using_pack {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class... Ts>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct S : Ts... {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using typename Ts::x... UIE; // expected-error 2 {{target of using declaration conflicts with declaration already in scope}} expected-note{{conflicting declaration}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct E1 {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct E2 {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S<E1, E2> a;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct F1 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  typedef int x; // expected-note 2 {{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct F2 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  typedef int x; // expected-note 2 {{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S<F1, F2> b;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S<E1, F2> c; // expected-note{{in instantiation of template class}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S<F1, E2> d; // expected-note{{in instantiation of template class}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class... Ts>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct S2 : Ts... {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using typename Ts::x... UIE; // expected-error 2 {{target of using declaration conflicts with declaration already in scope}} expected-note 3 {{using declaration annotated with 'using_if_exists' here}} expected-note{{conflicting declaration}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  x mem(); // expected-error 3 {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S2<E1, E2> e; // expected-note{{in instantiation of template class}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S2<F1, F2> f;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S2<E1, F2> g; // expected-note{{in instantiation of template class}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S2<F1, E2> h; // expected-note{{in instantiation of template class}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class... Ts>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct S3 : protected Ts... {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using Ts::m... UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct B1 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  enum { m }; // expected-note{{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct B2 {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S3<B1, B2> i; // expected-note{{in instantiation of template}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++S<B2, B1> j;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_using_pack
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_nested {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x UIE; // expected-note {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS2 {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ::test_nested::x UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++NS2::x y; // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_nested
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_scope {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int x; // expected-note{{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void f() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  int x; // expected-note{{conflicting declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    using ::x UIE; // expected-note {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (void)x;       // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    using test_scope::x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    using ::x UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    (void)x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  (void)x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using ::x UIE; // expected-error{{target of using declaration conflicts with declaration already in scope}} expected-note{{target of using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  (void)x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_scope
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace test_appertains_to {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef int x;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// FIXME: This diagnostics is wrong.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using alias UIE = NS::x; // expected-error {{'using_if_exists' attribute only applies to named declarations, types, and value declarations}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using template_alias UIE = NS::x; // expected-error {{'using_if_exists' attribute only applies to named declarations, types, and value declarations}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void f() UIE; // expected-error {{'using_if_exists' attribute only applies to named declarations, types, and value declarations}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using namespace NS UIE; // expected-error {{'using_if_exists' attribute only applies to named declarations, types, and value declarations}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace test_appertains_to
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++typedef int *fake_FILE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int fake_printf();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace std {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ::fake_FILE UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ::fake_printf UIE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ::fake_fopen UIE;  // expected-note {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ::fake_size_t UIE; // expected-note {{using declaration annotated with 'using_if_exists' here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // namespace std
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int main() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::fake_FILE file;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  file = std::fake_fopen(); // expected-error {{reference to unresolved using declaration}} expected-error{{incompatible integer to pointer}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  std::fake_size_t size;    // expected-error {{reference to unresolved using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  size = fake_printf();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  size = std::fake_printf();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 93f9797a965e..e533703e5158 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/tools/libclang/CIndex.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/tools/libclang/CIndex.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6406,6 +6406,7 @@ CXCursor clang_getCursorDefinition(CXCursor C) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::Concept:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::LifetimeExtendedTemporary:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   case Decl::RequiresExprBody:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  case Decl::UnresolvedUsingIfExists:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return C;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Declaration kinds that don't make any sense here, but are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.37.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/clang-11-bootstrap/files/0036-clang-Parse-Add-parsing-support-for-C-attributes-on-.patch b/lang/clang-11-bootstrap/files/0036-clang-Parse-Add-parsing-support-for-C-attributes-on-.patch
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..565b2dfced3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/clang-11-bootstrap/files/0036-clang-Parse-Add-parsing-support-for-C-attributes-on-.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,423 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From da46206ab118338f438756e7d3bf2cd87f1badb0 Mon Sep 17 00:00:00 2001
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+From: "Kirill A. Korinsky" <kirill@korins.ky>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Date: Tue, 30 Aug 2022 14:35:02 +0200
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+Subject: [PATCH] [clang][Parse] Add parsing support for C++ attributes on
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ using-declarations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This is backport of https://reviews.llvm.org/D91630 to clang-11
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+---
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/docs/LanguageExtensions.rst             | 14 +++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/docs/ReleaseNotes.rst                   |  3 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .../clang/Basic/DiagnosticParseKinds.td       |  3 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .../clang/Basic/DiagnosticSemaKinds.td        |  3 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/Basic/Features.def        |  1 +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/include/clang/Parse/Parser.h            |  5 ++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Parse/ParseDecl.cpp                 |  7 +++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Parse/ParseDeclCXX.cpp              | 54 +++++++++----------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/SemaDeclAttr.cpp               | 12 +++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/lib/Sema/SemaDeclCXX.cpp                |  6 ++-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ clang/test/Parser/cxx0x-attributes.cpp        | 15 ++++--
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .../cxx11-attributes-on-using-declaration.cpp | 42 +++++++++++++++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 12 files changed, 131 insertions(+), 34 deletions(-)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ create mode 100644 clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/docs/LanguageExtensions.rst b/clang/docs/LanguageExtensions.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 06ecc186c7dc..7408333be64f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/docs/LanguageExtensions.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/docs/LanguageExtensions.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -619,6 +619,20 @@ Attributes on the ``enum`` declaration do not apply to individual enumerators.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Query for this feature with ``__has_extension(enumerator_attributes)``.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++C++11 Attributes on using-declarations
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++======================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Clang allows C++-style ``[[]]`` attributes to be written on using-declarations.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++For instance:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.. code-block:: c++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[clang::using_if_exists]] using foo::bar;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using foo::baz [[clang::using_if_exists]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++You can test for support for this extension with
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++``__has_extension(cxx_attributes_on_using_declarations)``.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 'User-Specified' System Frameworks
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ==================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0ccaa7a82121..720e941e3b87 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/docs/ReleaseNotes.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/docs/ReleaseNotes.rst
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -302,6 +302,9 @@ Attribute Changes in Clang
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   `Clang Plugins <ClangPlugins.html#defining-attributes>`_ documentation for
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   details.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++- Added support for C++11-style ``[[]]`` attributes on using-declarations, as a
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  clang extension.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Windows Support
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ---------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 1038a4119d4c..a89e6067b2b5 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -672,6 +672,9 @@ def ext_using_attribute_ns : ExtWarn<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_using_attribute_ns_conflict : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "attribute with scope specifier cannot follow default scope specifier">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_attributes_not_allowed : Error<"an attribute list cannot appear here">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def ext_cxx11_attr_placement : ExtWarn<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "ISO C++ does not allow an attribute list to appear here">,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  InGroup<DiagGroup<"cxx-attribute-extension">>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_attributes_misplaced : Error<"misplaced attributes; expected attributes here">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_l_square_l_square_not_attribute : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "C++11 only allows consecutive left square brackets when "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0581296ac802..2f4511e4110f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3824,6 +3824,9 @@ def warn_attribute_sentinel_named_arguments : Warning<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def warn_attribute_sentinel_not_variadic : Warning<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "'sentinel' attribute only supported for variadic %select{functions|blocks}0">,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   InGroup<IgnoredAttributes>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++def warn_deprecated_ignored_on_using : Warning<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  "%0 currently has no effect on a using declaration">,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  InGroup<IgnoredAttributes>;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_attribute_sentinel_less_than_zero : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   "'sentinel' parameter 1 less than zero">;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ def err_attribute_sentinel_not_zero_or_one : Error<
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Basic/Features.def b/clang/include/clang/Basic/Features.def
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 999bcb7e2e29..7234eceb493e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Basic/Features.def
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Basic/Features.def
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -255,6 +255,7 @@ EXTENSION(pragma_clang_attribute_external_declaration, true)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EXTENSION(gnu_asm, LangOpts.GNUAsm)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EXTENSION(gnu_asm_goto_with_outputs, LangOpts.GNUAsm)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ EXTENSION(matrix_types, LangOpts.MatrixTypes)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++EXTENSION(cxx_attributes_on_using_declarations, LangOpts.CPlusPlus11)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef EXTENSION
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #undef FEATURE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/include/clang/Parse/Parser.h b/clang/include/clang/Parse/Parser.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e809d87b59a0..8a7418389933 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/include/clang/Parse/Parser.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/include/clang/Parse/Parser.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2631,6 +2631,10 @@ private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /// locations where attributes are not allowed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   void DiagnoseAndSkipCXX11Attributes();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// Emit warnings for C++11 and C2x attributes that are in a position that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  /// clang accepts as an extension.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  void DiagnoseCXX11AttributeExtension(ParsedAttributesWithRange &Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /// Parses syntax-generic attribute arguments for attributes which are
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /// known to the implementation, and adds them to the given ParsedAttributes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   /// list with the given attribute syntax. Returns the number of arguments
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2962,6 +2966,7 @@ private:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        const ParsedTemplateInfo &TemplateInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        SourceLocation UsingLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        SourceLocation &DeclEnd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                       ParsedAttributesWithRange &Attrs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                        AccessSpecifier AS = AS_none);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Decl *ParseAliasDeclarationAfterDeclarator(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       const ParsedTemplateInfo &TemplateInfo, SourceLocation UsingLoc,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Parse/ParseDecl.cpp b/clang/lib/Parse/ParseDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c87d240a8206..8967aa74feda 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Parse/ParseDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Parse/ParseDecl.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1549,6 +1549,13 @@ void Parser::ProhibitCXX11Attributes(ParsedAttributesWithRange &Attrs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++void Parser::DiagnoseCXX11AttributeExtension(ParsedAttributesWithRange &Attrs) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  for (const ParsedAttr &PA : Attrs) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (PA.isCXX11Attribute() || PA.isC2xAttribute())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      Diag(PA.getLoc(), diag::ext_cxx11_attr_placement) << PA << PA.getRange();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Usually, `__attribute__((attrib)) class Foo {} var` means that attribute
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // applies to var, not the type Foo.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // As an exception to the rule, __declspec(align(...)) before the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Parse/ParseDeclCXX.cpp b/clang/lib/Parse/ParseDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ddcbb5615fee..f4b774f7071d 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Parse/ParseDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Parse/ParseDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -497,11 +497,7 @@ Parser::ParseUsingDirectiveOrDeclaration(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Otherwise, it must be a using-declaration or an alias-declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // Using declarations can't have attributes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ProhibitAttributes(attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return ParseUsingDeclaration(Context, TemplateInfo, UsingLoc, DeclEnd, attrs,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                AS_none);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -628,7 +624,8 @@ bool Parser::ParseUsingDeclarator(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Context == DeclaratorContext::MemberContext &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       Tok.is(tok::identifier) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       (NextToken().is(tok::semi) || NextToken().is(tok::comma) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-       NextToken().is(tok::ellipsis)) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       NextToken().is(tok::ellipsis) || NextToken().is(tok::l_square) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++       NextToken().is(tok::kw___attribute)) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       D.SS.isNotEmpty() && LastII == Tok.getIdentifierInfo() &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       !D.SS.getScopeRep()->getAsNamespace() &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       !D.SS.getScopeRep()->getAsNamespaceAlias()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -671,11 +668,10 @@ bool Parser::ParseUsingDeclarator(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ///     alias-declaration: C++11 [dcl.dcl]p1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ///       'using' identifier attribute-specifier-seq[opt] = type-id ;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ///
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-Parser::DeclGroupPtrTy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-Parser::ParseUsingDeclaration(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              const ParsedTemplateInfo &TemplateInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              SourceLocation UsingLoc, SourceLocation &DeclEnd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                              AccessSpecifier AS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Parser::DeclGroupPtrTy Parser::ParseUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DeclaratorContext Context, const ParsedTemplateInfo &TemplateInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    SourceLocation UsingLoc, SourceLocation &DeclEnd,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ParsedAttributesWithRange &PrefixAttrs, AccessSpecifier AS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Check for misplaced attributes before the identifier in an
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // alias-declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ParsedAttributesWithRange MisplacedAttrs(AttrFactory);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -688,6 +684,17 @@ Parser::ParseUsingDeclaration(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MaybeParseGNUAttributes(Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MaybeParseCXX11Attributes(Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // If we had any misplaced attributes from earlier, this is where they
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // should have been written.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (MisplacedAttrs.Range.isValid()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Diag(MisplacedAttrs.Range.getBegin(), diag::err_attributes_not_allowed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        << FixItHint::CreateInsertionFromRange(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               Tok.getLocation(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++               CharSourceRange::getTokenRange(MisplacedAttrs.Range))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        << FixItHint::CreateRemoval(MisplacedAttrs.Range);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Attrs.takeAllFrom(MisplacedAttrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Maybe this is an alias-declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (Tok.is(tok::equal)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (InvalidDeclarator) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -695,16 +702,7 @@ Parser::ParseUsingDeclaration(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // If we had any misplaced attributes from earlier, this is where they
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // should have been written.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    if (MisplacedAttrs.Range.isValid()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      Diag(MisplacedAttrs.Range.getBegin(), diag::err_attributes_not_allowed)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        << FixItHint::CreateInsertionFromRange(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               Tok.getLocation(),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-               CharSourceRange::getTokenRange(MisplacedAttrs.Range))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-        << FixItHint::CreateRemoval(MisplacedAttrs.Range);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      Attrs.takeAllFrom(MisplacedAttrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ProhibitAttributes(PrefixAttrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Decl *DeclFromDeclSpec = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Decl *AD = ParseAliasDeclarationAfterDeclarator(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -712,10 +710,7 @@ Parser::ParseUsingDeclaration(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return Actions.ConvertDeclToDeclGroup(AD, DeclFromDeclSpec);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // C++11 attributes are not allowed on a using-declaration, but GNU ones
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // are.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ProhibitAttributes(MisplacedAttrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ProhibitAttributes(Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  DiagnoseCXX11AttributeExtension(PrefixAttrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Diagnose an attempt to declare a templated using-declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // In C++11, alias-declarations can be templates:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -733,8 +728,11 @@ Parser::ParseUsingDeclaration(DeclaratorContext Context,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   SmallVector<Decl *, 8> DeclsInGroup;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   while (true) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    // Parse (optional) attributes (most likely GNU strong-using extension).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Parse (optional) attributes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     MaybeParseGNUAttributes(Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    MaybeParseCXX11Attributes(Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    DiagnoseCXX11AttributeExtension(Attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    Attrs.addAll(PrefixAttrs.begin(), PrefixAttrs.end());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (InvalidDeclarator)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       SkipUntil(tok::comma, tok::semi, StopBeforeMatch);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2578,8 +2576,6 @@ Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   MaybeParseMicrosoftAttributes(attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (Tok.is(tok::kw_using)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    ProhibitAttributes(attrs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Eat 'using'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     SourceLocation UsingLoc = ConsumeToken();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2598,7 +2594,7 @@ Parser::ParseCXXClassMemberDeclaration(AccessSpecifier AS,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     SourceLocation DeclEnd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     // Otherwise, it must be a using-declaration or an alias-declaration.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return ParseUsingDeclaration(DeclaratorContext::MemberContext, TemplateInfo,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                                 UsingLoc, DeclEnd, AS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                                 UsingLoc, DeclEnd, attrs, AS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Hold late-parsed attributes so we can attach a Decl to them later.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 3cff1937e221..92f0c314635b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaDeclAttr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaDeclAttr.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2416,6 +2416,13 @@ AvailabilityAttr *Sema::mergeAvailabilityAttr(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static void handleAvailabilityAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (isa<UsingDecl, UnresolvedUsingTypenameDecl, UnresolvedUsingValueDecl>(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++          D)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    S.Diag(AL.getRange().getBegin(), diag::warn_deprecated_ignored_on_using)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        << AL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!checkAttributeNumArgs(S, AL, 1))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   IdentifierLoc *Platform = AL.getArgAsIdent(0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -6398,6 +6405,11 @@ static void handleDeprecatedAttr(Sema &S, Decl *D, const ParsedAttr &AL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // namespace.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  } else if (isa<UsingDecl, UnresolvedUsingTypenameDecl,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++                 UnresolvedUsingValueDecl>(D)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    S.Diag(AL.getRange().getBegin(), diag::warn_deprecated_ignored_on_using)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        << AL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Handle the cases where the attribute has a text message.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/lib/Sema/SemaDeclCXX.cpp b/clang/lib/Sema/SemaDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 710fe3bce6ef..119f61a1f2d9 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/lib/Sema/SemaDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/lib/Sema/SemaDeclCXX.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11638,7 +11638,7 @@ bool Sema::CheckUsingShadowDecl(UsingDecl *Using, NamedDecl *Orig,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Always emit a diagnostic for a mismatch between an unresolved
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // using_if_exists and a resolved using declaration in either direction.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (isa<UnresolvedUsingIfExistsDecl>(Target) !=
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-      (isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      (llvm::isa_and_nonnull<UnresolvedUsingIfExistsDecl>(NonTag))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (!NonTag && !Tag)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     Diag(Using->getLocation(), diag::err_using_decl_conflict);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -11991,9 +11991,9 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   DeclContext *LookupContext = computeDeclContext(SS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  NamedDecl *D;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   NestedNameSpecifierLoc QualifierLoc = SS.getWithLocInContext(Context);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!LookupContext || EllipsisLoc.isValid()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    NamedDecl *D;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     if (HasTypenameKeyword) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       // FIXME: not all declaration name kinds are legal here
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+       D = UnresolvedUsingTypenameDecl::Create(Context, CurContext,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12007,6 +12007,7 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     D->setAccess(AS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CurContext->addDecl(D);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ProcessDeclAttributeList(S, D, AttrList);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return D;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -12016,6 +12017,7 @@ NamedDecl *Sema::BuildUsingDeclaration(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                           UsingName, HasTypenameKeyword);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     UD->setAccess(AS);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     CurContext->addDecl(UD);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    ProcessDeclAttributeList(S, UD, AttrList);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     UD->setInvalidDecl(Invalid);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     return UD;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/test/Parser/cxx0x-attributes.cpp b/clang/test/Parser/cxx0x-attributes.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 101e03845b8f..f01fe389a992 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clang/test/Parser/cxx0x-attributes.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/test/Parser/cxx0x-attributes.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -131,12 +131,12 @@ extern "C++" [[]] { } // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [[]] static_assert(true, ""); //expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [[]] asm(""); // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-[[]] using ns::i; // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[]] using ns::i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [[unknown]] using namespace ns; // expected-warning {{unknown attribute 'unknown' ignored}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [[noreturn]] using namespace ns; // expected-error {{'noreturn' attribute only applies to functions}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ namespace [[]] ns2 {} // expected-warning {{attributes on a namespace declaration are a C++17 extension}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-using [[]] alignas(4) [[]] ns::i; // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using[[]] alignas(4)[[]] ns::i;          // expected-error {{an attribute list cannot appear here}} expected-error {{'alignas' attribute only applies to variables, data members and tag types}} expected-warning {{ISO C++}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ using [[]] alignas(4) [[]] foobar = int; // expected-error {{an attribute list cannot appear here}} expected-error {{'alignas' attribute only applies to}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void bad_attributes_in_do_while() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -157,7 +157,16 @@ void bad_attributes_in_do_while() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [[]] using T = int; // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ using T [[]] = int; // ok
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ template<typename T> using U [[]] = T;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-using ns::i [[]]; // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ns::i [[]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using ns::i [[]], ns::i [[]]; // expected-warning {{use of multiple declarators in a single using declaration is a C++17 extension}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct using_in_struct_base {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  typedef int i, j, k, l;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct using_in_struct : using_in_struct_base {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[]] using using_in_struct_base::i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using using_in_struct_base::j [[]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[]] using using_in_struct_base::k [[]], using_in_struct_base::l [[]]; // expected-warning {{use of multiple declarators in a single using declaration is a C++17 extension}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ using [[]] ns::i; // expected-error {{an attribute list cannot appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ using T [[unknown]] = int; // expected-warning {{unknown attribute 'unknown' ignored}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ using T [[noreturn]] = int; // expected-error {{'noreturn' attribute only applies to functions}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp b/clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 000000000000..5823ba7bfc2f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clang/test/SemaCXX/cxx11-attributes-on-using-declaration.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,42 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// RUN: %clang_cc1 -pedantic -triple x86_64-apple-macos11 -std=c++20 -fsyntax-only -verify %s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static_assert(__has_extension(cxx_attributes_on_using_declarations), "");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++namespace NS { typedef int x; }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[clang::annotate("foo")]] using NS::x; // expected-warning{{ISO C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[deprecated]] using NS::x;                                    // expected-warning {{'deprecated' currently has no effect on a using declaration}} expected-warning{{ISO C++ does not allow}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x [[deprecated]];                                    // expected-warning {{'deprecated' currently has no effect on a using declaration}} expected-warning{{ISO C++ does not allow}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x __attribute__((deprecated));                       // expected-warning {{'deprecated' currently has no effect on a using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++using NS::x __attribute__((availability(macos,introduced=1))); // expected-warning {{'availability' currently has no effect on a using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[clang::availability(macos,introduced=1)]] using NS::x; // expected-warning {{'availability' currently has no effect on a using declaration}} expected-warning{{ISO C++ does not allow}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++// expected-warning@+1 3 {{ISO C++ does not allow an attribute list to appear here}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[[clang::annotate("A")]] using NS::x [[clang::annotate("Y")]], NS::x [[clang::annotate("Z")]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class T>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct S : T {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[deprecated]] using typename T::x; // expected-warning{{ISO C++ does not allow}} expected-warning {{'deprecated' currently has no effect on a using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  [[deprecated]] using T::y;          // expected-warning{{ISO C++ does not allow}} expected-warning {{'deprecated' currently has no effect on a using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using typename T::z [[deprecated]]; // expected-warning{{ISO C++ does not allow}} expected-warning {{'deprecated' currently has no effect on a using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using T::a [[deprecated]];          // expected-warning{{ISO C++ does not allow}} expected-warning {{'deprecated' currently has no effect on a using declaration}}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct Base {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class B>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct DepBase1 : B {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using B::B [[]];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++template <class B>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct DepBase2 : B {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  using B::B __attribute__(());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++DepBase1<Base> db1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++DepBase2<Base> db2;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-- 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+2.37.2
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span></pre><pre style='margin:0'>

</pre>