<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;"><div>Wow, this is showing me how many of the analyzer checks aren't handling namespaces <i>within</i> std.</div><div><br></div><div>Jordan</div><br><div><div>On May 27, 2014, at 19:16 , Richard Trieu <<a href="mailto:rtrieu@google.com">rtrieu@google.com</a>> wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite">Author: rtrieu<br>Date: Tue May 27 21:16:01 2014<br>New Revision: 209708<br><br>URL: <a href="http://llvm.org/viewvc/llvm-project?rev=209708&view=rev">http://llvm.org/viewvc/llvm-project?rev=209708&view=rev</a><br>Log:<br>Move the logic for testing for namespace std into one location.  This check can<br>be performed by using Decl::isInStdNamespace or DeclContext::isStdNamespace<br><br>Modified:<br>    cfe/trunk/include/clang/AST/DeclBase.h<br>    cfe/trunk/lib/AST/Decl.cpp<br>    cfe/trunk/lib/AST/DeclBase.cpp<br>    cfe/trunk/lib/Analysis/Consumed.cpp<br>    cfe/trunk/lib/Sema/SemaExceptionSpec.cpp<br>    cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp<br>    cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp<br><br>Modified: cfe/trunk/include/clang/AST/DeclBase.h<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/DeclBase.h?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/include/clang/AST/DeclBase.h (original)<br>+++ cfe/trunk/include/clang/AST/DeclBase.h Tue May 27 21:16:01 2014<br>@@ -397,6 +397,8 @@ public:<br><br>   bool isInAnonymousNamespace() const;<br><br>+  bool isInStdNamespace() const;<br>+<br>   ASTContext &getASTContext() const LLVM_READONLY;<br><br>   void setAccess(AccessSpecifier AS) {<br>@@ -1156,6 +1158,8 @@ public:<br>     return DeclKind == Decl::Namespace;<br>   }<br><br>+  bool isStdNamespace() const;<br>+<br>   bool isInlineNamespace() const;<br><br>   /// \brief Determines whether this context is dependent on a<br><br>Modified: cfe/trunk/lib/AST/Decl.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/AST/Decl.cpp (original)<br>+++ cfe/trunk/lib/AST/Decl.cpp Tue May 27 21:16:01 2014<br>@@ -2328,12 +2328,6 @@ bool FunctionDecl::isReservedGlobalPlace<br>   return (proto->getParamType(1).getCanonicalType() == Context.VoidPtrTy);<br> }<br><br>-static bool isNamespaceStd(const DeclContext *DC) {<br>-  const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC->getRedeclContext());<br>-  return ND && isNamed(ND, "std") &&<br>-         ND->getParent()->getRedeclContext()->isTranslationUnit();<br>-}<br>-<br> bool FunctionDecl::isReplaceableGlobalAllocationFunction() const {<br>   if (getDeclName().getNameKind() != DeclarationName::CXXOperatorName)<br>     return false;<br>@@ -2371,9 +2365,8 @@ bool FunctionDecl::isReplaceableGlobalAl<br>   Ty = Ty->getPointeeType();<br>   if (Ty.getCVRQualifiers() != Qualifiers::Const)<br>     return false;<br>-  // FIXME: Recognise nothrow_t in an inline namespace inside std?<br>   const CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();<br>-  return RD && isNamed(RD, "nothrow_t") && isNamespaceStd(RD->getDeclContext());<br>+  return RD && isNamed(RD, "nothrow_t") && RD->isInStdNamespace();<br> }<br><br> FunctionDecl *<br><br>Modified: cfe/trunk/lib/AST/DeclBase.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/DeclBase.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/AST/DeclBase.cpp (original)<br>+++ cfe/trunk/lib/AST/DeclBase.cpp Tue May 27 21:16:01 2014<br>@@ -251,6 +251,10 @@ bool Decl::isInAnonymousNamespace() cons<br>   return false;<br> }<br><br>+bool Decl::isInStdNamespace() const {<br>+  return getDeclContext()->isStdNamespace();<br>+}<br>+<br> TranslationUnitDecl *Decl::getTranslationUnitDecl() {<br>   if (TranslationUnitDecl *TUD = dyn_cast<TranslationUnitDecl>(this))<br>     return TUD;<br>@@ -795,6 +799,22 @@ bool DeclContext::isInlineNamespace() co<br>          cast<NamespaceDecl>(this)->isInline();<br> }<br><br>+bool DeclContext::isStdNamespace() const {<br>+  if (!isNamespace())<br>+    return false;<br>+<br>+  const NamespaceDecl *ND = cast<NamespaceDecl>(this);<br>+  if (ND->isInline()) {<br>+    return ND->getParent()->isStdNamespace();<br>+  }<br>+<br>+  if (!getParent()->getRedeclContext()->isTranslationUnit())<br>+    return false;<br>+<br>+  const IdentifierInfo *II = ND->getIdentifier();<br>+  return II && II->isStr("std");<br>+}<br>+<br> bool DeclContext::isDependentContext() const {<br>   if (isFileContext())<br>     return false;<br><br>Modified: cfe/trunk/lib/Analysis/Consumed.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/Consumed.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/Consumed.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Analysis/Consumed.cpp (original)<br>+++ cfe/trunk/lib/Analysis/Consumed.cpp Tue May 27 21:16:01 2014<br>@@ -739,16 +739,6 @@ void ConsumedStmtVisitor::VisitBinaryOpe<br>   }<br> }<br><br>-static bool isStdNamespace(const DeclContext *DC) {<br>-  if (!DC->isNamespace()) return false;<br>-  while (DC->getParent()->isNamespace())<br>-    DC = DC->getParent();<br>-  const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC);<br>-<br>-  return ND && ND->getName() == "std" &&<br>-         ND->getDeclContext()->isTranslationUnit();<br>-}<br>-<br> void ConsumedStmtVisitor::VisitCallExpr(const CallExpr *Call) {<br>   const FunctionDecl *FunDecl = Call->getDirectCallee();<br>   if (!FunDecl)<br>@@ -756,9 +746,8 @@ void ConsumedStmtVisitor::VisitCallExpr(<br><br>   // Special case for the std::move function.<br>   // TODO: Make this more specific. (Deferred)<br>-  if (Call->getNumArgs() == 1 &&<br>-      FunDecl->getNameAsString() == "move" &&<br>-      isStdNamespace(FunDecl->getDeclContext())) {<br>+  if (Call->getNumArgs() == 1 && FunDecl->getNameAsString() == "move" &&<br>+      FunDecl->isInStdNamespace()) {<br>     copyInfo(Call->getArg(0), Call, CS_Consumed);<br>     return;<br>   }<br><br>Modified: cfe/trunk/lib/Sema/SemaExceptionSpec.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExceptionSpec.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Sema/SemaExceptionSpec.cpp (original)<br>+++ cfe/trunk/lib/Sema/SemaExceptionSpec.cpp Tue May 27 21:16:01 2014<br>@@ -468,15 +468,8 @@ bool Sema::CheckEquivalentExceptionSpec(<br>         IdentifierInfo* Name = ExRecord->getIdentifier();<br>         if (Name && Name->getName() == "bad_alloc") {<br>           // It's called bad_alloc, but is it in std?<br>-          DeclContext* DC = ExRecord->getDeclContext();<br>-          DC = DC->getEnclosingNamespaceContext();<br>-          if (NamespaceDecl* NS = dyn_cast<NamespaceDecl>(DC)) {<br>-            IdentifierInfo* NSName = NS->getIdentifier();<br>-            DC = DC->getParent();<br>-            if (NSName && NSName->getName() == "std" &&<br>-                DC->getEnclosingNamespaceContext()->isTranslationUnit()) {<br>-              return false;<br>-            }<br>+          if (ExRecord->isInStdNamespace()) {<br>+            return false;<br>           }<br>         }<br>       }<br><br>Modified: cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp (original)<br>+++ cfe/trunk/lib/Sema/SemaTemplateInstantiateDecl.cpp Tue May 27 21:16:01 2014<br>@@ -887,11 +887,7 @@ Decl *TemplateDeclInstantiator::VisitCla<br>         if (DCParent->isNamespace() &&<br>             cast<NamespaceDecl>(DCParent)->getIdentifier() &&<br>             cast<NamespaceDecl>(DCParent)->getIdentifier()->isStr("tr1")) {<br>-          DeclContext *DCParent2 = DCParent->getParent();<br>-          if (DCParent2->isNamespace() &&<br>-              cast<NamespaceDecl>(DCParent2)->getIdentifier() &&<br>-              cast<NamespaceDecl>(DCParent2)->getIdentifier()->isStr("std") &&<br>-              DCParent2->getParent()->isTranslationUnit())<br>+          if (cast<Decl>(DCParent)->isInStdNamespace())<br>             Complain = false;<br>         }<br>       }<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Checkers/LLVMConventionsChecker.cpp Tue May 27 21:16:01 2014<br>@@ -58,7 +58,7 @@ static bool IsStdString(QualType T) {<br><br>   const TypedefNameDecl *TD = TT->getDecl();<br><br>-  if (!InNamespace(TD, "std"))<br>+  if (!TD->isInStdNamespace())<br>     return false;<br><br>   return TD->getName() == "string";<br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp Tue May 27 21:16:01 2014<br>@@ -1514,7 +1514,7 @@ static bool isInStdNamespace(const Decl<br>   while (const NamespaceDecl *Parent = dyn_cast<NamespaceDecl>(ND->getParent()))<br>     ND = Parent;<br><br>-  return ND->getName() == "std";<br>+  return ND->isStdNamespace();<br> }<br><br><br><br>Modified: cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp<br>URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=209708&r1=209707&r2=209708&view=diff">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp?rev=209708&r1=209707&r2=209708&view=diff</a><br>==============================================================================<br>--- cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp (original)<br>+++ cfe/trunk/lib/StaticAnalyzer/Core/ExprEngineCallAndReturn.cpp Tue May 27 21:16:01 2014<br>@@ -387,14 +387,14 @@ static bool IsInStdNamespace(const Funct<br>   const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(DC);<br>   if (!ND)<br>     return false;<br>-  <br>+<br>   while (const DeclContext *Parent = ND->getParent()) {<br>     if (!isa<NamespaceDecl>(Parent))<br>       break;<br>     ND = cast<NamespaceDecl>(Parent);<br>   }<br><br>-  return ND->getName() == "std";<br>+  return ND->isStdNamespace();<br> }<br><br> // The GDM component containing the dynamic dispatch bifurcation info. When<br><br><br>_______________________________________________<br>cfe-commits mailing list<br><a href="mailto:cfe-commits@cs.uiuc.edu">cfe-commits@cs.uiuc.edu</a><br>http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits<br></blockquote></div><br></body></html>