Skip to content
This repository has been archived by the owner on Apr 23, 2020. It is now read-only.

Commit

Permalink
Respect -Wnewline-eof even in C++11 mode.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
jrose-apple committed Aug 23, 2013
1 parent 3618e6f commit 7865b8e
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 13 deletions.
1 change: 1 addition & 0 deletions include/clang/Basic/DiagnosticGroups.td
Original file line number Diff line number Diff line change
Expand Up @@ -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">;
Expand Down
4 changes: 3 additions & 1 deletion include/clang/Basic/DiagnosticLexKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -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">,
Expand Down
26 changes: 22 additions & 4 deletions lib/Lex/Lexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
5 changes: 0 additions & 5 deletions test/Lexer/newline-eof-c++11.cpp

This file was deleted.

1 change: 1 addition & 0 deletions test/Lexer/newline-eof-c++98-compat.cpp
Original file line number Diff line number Diff line change
@@ -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}}
12 changes: 9 additions & 3 deletions test/Lexer/newline-eof.c
Original file line number Diff line number Diff line change
@@ -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}}

0 comments on commit 7865b8e

Please sign in to comment.