From: Vassil Vassilev Date: Sat, 20 Aug 2016 14:50:22 +0000 (+0000) Subject: PR28423: Compare primary declaration contexts. X-Git-Tag: llvmorg-4.0.0-rc1~11826 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=8643639ab4248ce9ecf50490d00026c88b688f77;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/clang/lib/Sema/SemaExceptionSpec.cpp b/clang/lib/Sema/SemaExceptionSpec.cpp index 4a21eb3..73b39cc 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 02431e02..6d783fe 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 void swap(T &, T &); template void do_swap(T &a, T &b) noexcept(noexcept(swap(a, b))) {