r209708 - Move the logic for testing for namespace std into one location. This check can

Richard Smith richard at metafoo.co.uk
Thu May 29 20:24:45 PDT 2014


On Tue, May 27, 2014 at 8:22 PM, Jordan Rose <jordan_rose at apple.com> wrote:

> Wow, this is showing me how many of the analyzer checks aren't handling
> namespaces *within* std.
>

I think they might all be correct: the last two walk up to the outermost
namespace before checking whether it's 'std'. The first of the three is
looking for exactly 'std::string'.


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


More information about the cfe-commits mailing list