On Tue, Jan 8, 2013 at 9:43 PM, Rafael Espindola <[email protected]> wrote: > Author: rafael > Date: Tue Jan 8 13:43:34 2013 > New Revision: 171888 > > URL: http://llvm.org/viewvc/llvm-project?rev=171888&view=rev > Log: > Mark all subsequent decls used. > > In the source > > static void f(); > static void f(); > template<typename T> > static void g() { > f(); > } > static void f() { > } > void h() { > g<int>(); > } > > the call to f refers to the second decl, but it is only marked used at the end > of the translation unit during instantiation, after the third f decl has been > linked in. > > With this patch we mark all subsequent decls used, so that it is easy to check > if a symbol is used or not. > > Modified: > cfe/trunk/lib/Sema/Sema.cpp > cfe/trunk/lib/Sema/SemaExpr.cpp > cfe/trunk/test/SemaCXX/warn-func-not-needed.cpp > > Modified: cfe/trunk/lib/Sema/Sema.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=171888&r1=171887&r2=171888&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/Sema.cpp (original) > +++ cfe/trunk/lib/Sema/Sema.cpp Tue Jan 8 13:43:34 2013 > @@ -328,11 +328,7 @@ > > /// \brief Used to prune the decls of Sema's UnusedFileScopedDecls vector. > static bool ShouldRemoveFromUnused(Sema *SemaRef, const DeclaratorDecl *D) { > - // Template instantiation can happen at the end of the translation unit > - // and it sets the canonical (first) decl to used. Normal uses set the last > - // decl at the time to used and subsequent decl inherit the flag. The net > - // result is that we need to check both ends of the decl chain. > - if (D->isUsed() || D->getMostRecentDecl()->isUsed()) > + if (D->getMostRecentDecl()->isUsed()) > return true; > > if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) { > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=171888&r1=171887&r2=171888&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 8 13:43:34 2013 > @@ -10495,7 +10495,18 @@ > if (old.isInvalid()) old = Loc; > } > > - Func->setUsed(true); > + // Normally the must current decl is marked used while processing the use > and > + // any subsequent decls are marked used by decl merging. This fails with > + // template instantiation since marking can happen at the end of the file > + // and, because of the two phase lookup, this function is called with at > + // decl in the middle of a decl chain. We loop to maintain the invariant > + // that once a decl is used, all decls after it are also used. > + for (FunctionDecl *F = Func->getMostRecentDecl();;) { > + F->setUsed(true); > + if (F == Func) > + break; > + F = F->getPreviousDecl();
Maybe move that line to 'for(;;<here>)' ? Dmitri > + } > } > > static void > > Modified: cfe/trunk/test/SemaCXX/warn-func-not-needed.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/warn-func-not-needed.cpp?rev=171888&r1=171887&r2=171888&view=diff > ============================================================================== > --- cfe/trunk/test/SemaCXX/warn-func-not-needed.cpp (original) > +++ cfe/trunk/test/SemaCXX/warn-func-not-needed.cpp Tue Jan 8 13:43:34 2013 > @@ -28,3 +28,17 @@ > g<int>(); > } > } > + > +namespace test4 { > + static void f(); > + static void f(); > + template<typename T> > + static void g() { > + f(); > + } > + static void f() { > + } > + void h() { > + g<int>(); > + } > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits -- main(i,j){for(i=2;;i++){for(j=2;j<i;j++){if(!(i%j)){j=0;break;}}if (j){printf("%d\n",i);}}} /*Dmitri Gribenko <[email protected]>*/ _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
