]> granicus.if.org Git - clang/commitdiff
Workaround for libstdc++4.6 <atomic> bug: make comment more explicit about what's...
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 5 Oct 2012 01:46:25 +0000 (01:46 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 5 Oct 2012 01:46:25 +0000 (01:46 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165286 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/SemaDeclCXX.cpp

index e989fd541f42602416e5e2c2741554689efd9f0a..c898d81a61d80f35e3e263bb2749c91d4a7babfc 100644 (file)
@@ -5407,10 +5407,15 @@ static void DiagnoseNamespaceInlineMismatch(Sema &S, SourceLocation KeywordLoc,
                                             NamespaceDecl *PrevNS) {
   assert(*IsInline != PrevNS->isInline());
 
+  // HACK: Work around a bug in libstdc++4.6's <atomic>, where
+  // std::__atomic[0,1,2] are defined as non-inline namespaces, then reopened as
+  // inline namespaces, with the intention of bringing names into namespace std.
+  //
+  // We support this just well enough to get that case working; this is not
+  // sufficient to support reopening namespaces as inline in general.
   if (*IsInline && II && II->getName().startswith("__atomic") &&
       S.getSourceManager().isInSystemHeader(Loc)) {
-    // libstdc++4.6's <atomic> reopens a non-inline namespace as inline, and
-    // expects that to affect the earlier declaration.
+    // Mark all prior declarations of the namespace as inline.
     for (NamespaceDecl *NS = PrevNS->getMostRecentDecl(); NS;
          NS = NS->getPreviousDecl())
       NS->setInline(*IsInline);