[cfe-commits] [PATCH] Revert predefined tracking

Meador Inge meadori at codesourcery.com
Tue Jun 19 08:54:37 PDT 2012


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





More information about the cfe-commits mailing list