From: Richard Smith Date: Fri, 5 Oct 2012 01:46:25 +0000 (+0000) Subject: Workaround for libstdc++4.6 bug: make comment more explicit about what's... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c969e6a7e4260fdb284593ed344b51f51e7225f6;p=clang Workaround for libstdc++4.6 bug: make comment more explicit about what's going on, per Sean Silva's suggestion. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@165286 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaDeclCXX.cpp b/lib/Sema/SemaDeclCXX.cpp index e989fd541f..c898d81a61 100644 --- a/lib/Sema/SemaDeclCXX.cpp +++ b/lib/Sema/SemaDeclCXX.cpp @@ -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 , 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 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);