diff options
| author | Vassil Vassilev <v.g.vassilev@gmail.com> | 2016-08-20 14:50:22 +0000 |
|---|---|---|
| committer | Vassil Vassilev <v.g.vassilev@gmail.com> | 2016-08-20 14:50:22 +0000 |
| commit | 8643639ab4248ce9ecf50490d00026c88b688f77 (patch) | |
| tree | 76815c03002f92977717e9f3f710ce130a25d8b5 /clang | |
| parent | 235e479984b97758b7419f995a3f035c230fae9d (diff) | |
| download | bcm5719-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.cpp | 3 | ||||
| -rw-r--r-- | clang/test/SemaCXX/libstdcxx_pair_swap_hack.cpp | 5 |
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))) { |

