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