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.

llvm-svn: 279371

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

index 4a21eb3..73b39cc 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 02431e0..6d783fe 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))) {