Looks good to me now, go ahead and commit! (We still do have top-level declarations in the predefines for MS mode and ARC-under-libstdc++, but both of those are C++-only so this change shouldn't break anything.)
On Jun 19, 2012, at 8:54 , Meador Inge <[email protected]> wrote: > > On Jun 18, 2012, at 12:26 PM, Jordan Rose wrote: > >> Hi, Meador. Now that we don't need two loops, I think it would be cleaner to >> use an explicit if for the first decl, then a do-while loop to process them >> all. That way the WarnOnEmptyTU flag goes away. (But don't forget to only >> warn in non-C++ mode.) > > > Ah, great point. So something more like (we still need a flag in spirit for > the preprocessed header check): > > Index: lib/Parse/ParseAST.cpp > =================================================================== > --- lib/Parse/ParseAST.cpp (revision 158702) > +++ lib/Parse/ParseAST.cpp (working copy) > @@ -83,46 +83,24 @@ > // declaration. C++ doesn't have this restriction. We also don't want to > // complain if we have a precompiled header, although technically if the PCH > // is empty we should still emit the (pedantic) diagnostic. > - bool WarnForEmptyTU = !S.getLangOpts().CPlusPlus; > - if (ExternalASTSource *External = S.getASTContext().getExternalSource()) { > - External->StartTranslationUnit(Consumer); > - WarnForEmptyTU = false; > - } > - > - // Clang's predefines contain top-level declarations for things like > va_list, > - // making it hard to tell if the /user's/ translation unit has at least one > - // top-level declaration. So we parse cautiously, looking for a declaration > - // that doesn't come from our predefines. > - // Note that ParseTopLevelDecl returns 'true' at EOF. > - SourceManager &SM = S.getSourceManager(); > Parser::DeclGroupPtrTy ADecl; > - while (WarnForEmptyTU && !P.ParseTopLevelDecl(ADecl)) { > - if (ADecl) { > - if (!Consumer->HandleTopLevelDecl(ADecl.get())) > - return; > - if (DeclGroupRef::iterator FirstDecl = ADecl.get().begin()) { > - SourceLocation DeclLoc = (*FirstDecl)->getLocation(); > - WarnForEmptyTU = SM.isFromPredefines(DeclLoc); > - } > - } > - } > + ExternalASTSource *External = S.getASTContext().getExternalSource(); > + if (External) > + External->StartTranslationUnit(Consumer); > > - // If we ended up seeing EOF before any top-level declarations, emit our > - // diagnostic. Otherwise, parse the rest of the file normally. > - if (WarnForEmptyTU) { > - P.Diag(diag::ext_empty_translation_unit); > + if (P.ParseTopLevelDecl(ADecl)) { > + if (!External && !S.getLangOpts().CPlusPlus) > + P.Diag(diag::ext_empty_translation_unit); > } else { > - while (!P.ParseTopLevelDecl(ADecl)) { // Not end of file. > + do { > // If we got a null return and something *was* parsed, ignore it. This > // is due to a top-level semicolon, an action override, or a parse error > // skipping something. > - if (ADecl) { > - if (!Consumer->HandleTopLevelDecl(ADecl.get())) > - return; > - } > - }; > + if (ADecl && !Consumer->HandleTopLevelDecl(ADecl.get())) > + return; > + } while (!P.ParseTopLevelDecl(ADecl)); > } > - > + > // Process any TopLevelDecls generated by #pragma weak. > for (SmallVector<Decl*,2>::iterator > I = S.WeakTopLevelDecls().begin(), > > > Meador Inge > CodeSourcery / Mentor Embedded > http://www.mentor.com/embedded-software > _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
