summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorVassil Vassilev <v.g.vassilev@gmail.com>2016-08-20 14:50:22 +0000
committerVassil Vassilev <v.g.vassilev@gmail.com>2016-08-20 14:50:22 +0000
commit8643639ab4248ce9ecf50490d00026c88b688f77 (patch)
tree76815c03002f92977717e9f3f710ce130a25d8b5 /clang
parent235e479984b97758b7419f995a3f035c230fae9d (diff)
downloadbcm5719-llvm-8643639ab4248ce9ecf50490d00026c88b688f77.tar.gz
bcm5719-llvm-8643639ab4248ce9ecf50490d00026c88b688f77.zip
PR28423: Compare primary declaration contexts.
In certain cases (mostly coming from modules), Sema's idea of the StdNamespace does not point to the first declaration of namespace std. Patch by Cristina Cristescu! Reviewed by Richard Smith. llvm-svn: 279371
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaExceptionSpec.cpp3
-rw-r--r--clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp5
2 files changed, 7 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaExceptionSpec.cpp b/clang/lib/Sema/SemaExceptionSpec.cpp
index 4a21eb308fe..73b39cc550a 100644
--- a/clang/lib/Sema/SemaExceptionSpec.cpp
+++ b/clang/lib/Sema/SemaExceptionSpec.cpp
@@ -44,7 +44,8 @@ bool Sema::isLibstdcxxEagerExceptionSpecHack(const Declarator &D) {
// All the problem cases are member functions named "swap" within class
// templates declared directly within namespace std.
- if (!RD || RD->getEnclosingNamespaceContext() != getStdNamespace() ||
+ if (!RD || !getStdNamespace() ||
+ !RD->getEnclosingNamespaceContext()->Equals(getStdNamespace()) ||
!RD->getIdentifier() || !RD->getDescribedClassTemplate() ||
!D.getIdentifier() || !D.getIdentifier()->isStr("swap"))
return false;
diff --git a/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp b/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
index 02431e02e48..6d783fe5031 100644
--- a/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
+++ b/clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp
@@ -8,6 +8,7 @@
// affected are array, pair, priority_queue, stack, and queue.
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -DCLASS=array
+// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -DCLASS=array -DPR28423
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -DCLASS=pair
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -DCLASS=priority_queue
// RUN: %clang_cc1 -fsyntax-only %s -std=c++11 -verify -fexceptions -fcxx-exceptions -DCLASS=stack
@@ -21,6 +22,10 @@
#ifdef BE_THE_HEADER
#pragma GCC system_header
+#ifdef PR28423
+using namespace std;
+#endif
+
namespace std {
template<typename T> void swap(T &, T &);
template<typename T> void do_swap(T &a, T &b) noexcept(noexcept(swap(a, b))) {
OpenPOWER on IntegriCloud