On Tue, May 27, 2014 at 8:22 PM, Jordan Rose <[email protected]> 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 <[email protected]> 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 > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
