]> granicus.if.org Git - clang/commitdiff
PR28423: Compare primary declaration contexts.
authorVassil Vassilev <v.g.vassilev@gmail.com>
Sat, 20 Aug 2016 14:50:22 +0000 (14:50 +0000)
committerVassil Vassilev <v.g.vassilev@gmail.com>
Sat, 20 Aug 2016 14:50:22 +0000 (14:50 +0000)
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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@279371 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaExceptionSpec.cpp
test/SemaCXX/libstdcxx_pair_swap_hack.cpp

index 4a21eb308fe533bb04e320a591f88adaf6f569a7..73b39cc550a7641d3cf102f797d41287c23abe2d 100644 (file)
@@ -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;
index 02431e02e48dd6b6dba5bf862c818f765bfb216b..6d783fe5031ecf3d67591b8dd292b115b5738731 100644 (file)
@@ -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
 #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))) {