]> granicus.if.org Git - clang/commitdiff
Respect -Wnewline-eof even in C++11 mode.
authorJordan Rose <jordan_rose@apple.com>
Fri, 23 Aug 2013 15:42:01 +0000 (15:42 +0000)
committerJordan Rose <jordan_rose@apple.com>
Fri, 23 Aug 2013 15:42:01 +0000 (15:42 +0000)
If the user has requested this warning, we should emit it, even if it's not
an extension in the current language mode. However, being an extension is
more important, so prefer the pedantic warning or the pedantic-compatibility
warning if those are enabled.

<rdar://problem/12922063>

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@189110 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Basic/DiagnosticGroups.td
include/clang/Basic/DiagnosticLexKinds.td
lib/Lex/Lexer.cpp
test/Lexer/newline-eof-c++11.cpp [deleted file]
test/Lexer/newline-eof-c++98-compat.cpp
test/Lexer/newline-eof.c

index e46182badcf491f682630bcaa0dd764975b38082..dbbf7f65a87a9df6c09d342c097b287deb3f9747 100644 (file)
@@ -190,6 +190,7 @@ def MismatchedReturnTypes : DiagGroup<"mismatched-return-types">;
 def MismatchedTags : DiagGroup<"mismatched-tags">;
 def MissingFieldInitializers : DiagGroup<"missing-field-initializers">;
 def ModuleConflict : DiagGroup<"module-conflict">;
+def NewlineEOF : DiagGroup<"newline-eof">;
 def NullArithmetic : DiagGroup<"null-arithmetic">;
 def NullCharacter : DiagGroup<"null-character">;
 def NullDereference : DiagGroup<"null-dereference">;
index 90a3d71c777a2e2bcf660975061e90655449f2bc..ed798ab960e4a6b4c92be521658649e3f92dd6ab 100644 (file)
@@ -47,7 +47,9 @@ def ext_line_comment : Extension<
   "// comments are not allowed in this language">,
   InGroup<Comment>;
 def ext_no_newline_eof : Extension<"no newline at end of file">, 
-  InGroup<DiagGroup<"newline-eof">>;
+  InGroup<NewlineEOF>;
+def warn_no_newline_eof : Warning<"no newline at end of file">,
+  InGroup<NewlineEOF>, DefaultIgnore;
 
 def warn_cxx98_compat_no_newline_eof : Warning<
   "C++98 requires newline at end of file">,
index c28781dc5f2bef8e8739ae0bc355e8f8558fd71d..e3e01da8416f3f8309f6380c54b76cbb1714d3bb 100644 (file)
@@ -2410,10 +2410,28 @@ bool Lexer::LexEndOfFile(Token &Result, const char *CurPtr) {
 
   // C99 5.1.1.2p2: If the file is non-empty and didn't end in a newline, issue
   // a pedwarn.
-  if (CurPtr != BufferStart && (CurPtr[-1] != '\n' && CurPtr[-1] != '\r'))
-    Diag(BufferEnd, LangOpts.CPlusPlus11 ? // C++11 [lex.phases] 2.2 p2
-         diag::warn_cxx98_compat_no_newline_eof : diag::ext_no_newline_eof)
-    << FixItHint::CreateInsertion(getSourceLocation(BufferEnd), "\n");
+  if (CurPtr != BufferStart && (CurPtr[-1] != '\n' && CurPtr[-1] != '\r')) {
+    DiagnosticsEngine &Diags = PP->getDiagnostics();
+    SourceLocation EndLoc = getSourceLocation(BufferEnd);
+    unsigned DiagID;
+
+    if (LangOpts.CPlusPlus11) {
+      // C++11 [lex.phases] 2.2 p2
+      // Prefer the C++98 pedantic compatibility warning over the generic,
+      // non-extension, user-requested "missing newline at EOF" warning.
+      if (Diags.getDiagnosticLevel(diag::warn_cxx98_compat_no_newline_eof,
+                                   EndLoc) != DiagnosticsEngine::Ignored) {
+        DiagID = diag::warn_cxx98_compat_no_newline_eof;
+      } else {
+        DiagID = diag::warn_no_newline_eof;
+      }
+    } else {
+      DiagID = diag::ext_no_newline_eof;
+    }
+
+    Diag(BufferEnd, DiagID)
+      << FixItHint::CreateInsertion(EndLoc, "\n");
+  }
 
   BufferPtr = CurPtr;
 
diff --git a/test/Lexer/newline-eof-c++11.cpp b/test/Lexer/newline-eof-c++11.cpp
deleted file mode 100644 (file)
index eeabe8b..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-// RUN: %clang_cc1 -fsyntax-only -std=c++11 -Wnewline-eof -verify %s
-// expected-no-diagnostics
-
-// The following line isn't terminated, don't fix it.
-void foo() {}
\ No newline at end of file
index 3e5c8e2262351a2a334bb2e065cbe75ea13560da..9af0b889537b83dcb6a593d195a76b39f61c7c52 100644 (file)
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -fsyntax-only -Wc++98-compat-pedantic -std=c++11 -verify %s
+// RUN: %clang_cc1 -fsyntax-only -Wc++98-compat-pedantic -Wnewline-eof -std=c++11 -verify %s
 
 // The following line isn't terminated, don't fix it.
 void foo() {} // expected-warning{{C++98 requires newline at end of file}}
\ No newline at end of file
index a4a18835cf5fc1781bd7091af954aaf62c5111a9..d762519aaae5796474039f14be1343a9c3aae2c2 100644 (file)
@@ -1,9 +1,15 @@
-// RUN: %clang_cc1 -fsyntax-only -Wnewline-eof -verify %s
-// RUN: %clang_cc1 -fsyntax-only -Wnewline-eof %s 2>&1 | FileCheck %s
+// RUN: %clang -fsyntax-only -Wnewline-eof -verify %s
+// RUN: %clang -fsyntax-only -pedantic -verify %s
+// RUN: %clang -fsyntax-only -x c++ -std=c++03 -pedantic -verify %s
+// RUN: %clang -fsyntax-only -Wnewline-eof %s 2>&1 | FileCheck %s
 // rdar://9133072
 
+// In C++11 mode, this is allowed, so don't warn in pedantic mode.
+// RUN: %clang -fsyntax-only -x c++ -std=c++11 -Wnewline-eof -verify %s
+// RUN: %clang -fsyntax-only -x c++ -std=c++11 -pedantic %s
+
 // Make sure the diagnostic shows up properly at the end of the last line.
-// CHECK: newline-eof.c:9:63
+// CHECK: newline-eof.c:[[@LINE+3]]:63
 
 // The following line isn't terminated, don't fix it.
 void foo() {} // expected-warning{{no newline at end of file}}
\ No newline at end of file