diff options
author | Dmitri Gribenko <gribozavr@gmail.com> | 2013-01-21 11:25:03 +0000 |
---|---|---|
committer | Dmitri Gribenko <gribozavr@gmail.com> | 2013-01-21 11:25:03 +0000 |
commit | 445743dec72f675070d4789c348607cd8cbf6090 (patch) | |
tree | 02d894af1178b6e8c15b24b77d535f1260e4618c | |
parent | d24c9ab90b42370bb417f44e001a0347ee1ca87e (diff) |
Add a fixit for _Noreturn main,
add tests for fixits removing static and inline from main
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@173024 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 1 | ||||
-rw-r--r-- | lib/Sema/SemaDecl.cpp | 10 | ||||
-rw-r--r-- | test/Sema/warn-main.c | 32 |
3 files changed, 41 insertions, 2 deletions
diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 3999fadc51..3b37658abb 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -390,6 +390,7 @@ def err_static_main : Error<"'main' is not allowed to be declared static">; def err_inline_main : Error<"'main' is not allowed to be declared inline">; def ext_noreturn_main : ExtWarn< "'main' is not allowed to be declared _Noreturn">, InGroup<Main>; +def note_main_remove_noreturn : Note<"remove '_Noreturn'">; def err_constexpr_main : Error< "'main' is not allowed to be declared constexpr">; def err_main_template_decl : Error<"'main' cannot be a template">; diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 7936efa136..f73ea9875a 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -6474,8 +6474,14 @@ void Sema::CheckMain(FunctionDecl* FD, const DeclSpec& DS) { if (FD->isInlineSpecified()) Diag(DS.getInlineSpecLoc(), diag::err_inline_main) << FixItHint::CreateRemoval(DS.getInlineSpecLoc()); - if (DS.isNoreturnSpecified()) - Diag(DS.getNoreturnSpecLoc(), diag::ext_noreturn_main); + if (DS.isNoreturnSpecified()) { + SourceLocation NoreturnLoc = DS.getNoreturnSpecLoc(); + SourceRange NoreturnRange(NoreturnLoc, + PP.getLocForEndOfToken(NoreturnLoc)); + Diag(NoreturnLoc, diag::ext_noreturn_main); + Diag(NoreturnLoc, diag::note_main_remove_noreturn) + << FixItHint::CreateRemoval(NoreturnRange); + } if (FD->isConstexpr()) { Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_main) << FixItHint::CreateRemoval(DS.getConstexprSpecLoc()); diff --git a/test/Sema/warn-main.c b/test/Sema/warn-main.c new file mode 100644 index 0000000000..ecff32096d --- /dev/null +++ b/test/Sema/warn-main.c @@ -0,0 +1,32 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s +// RUN: %clang_cc1 -fsyntax-only -fdiagnostics-parseable-fixits -x c++ %s 2>&1 | FileCheck %s + +// expected-note@+1 2{{previous definition is here}} +int main() { + return 0; +} + +// expected-error@+2 {{static declaration of 'main' follows non-static declaration}} +// expected-warning@+1 {{'main' should not be declared static}} +static int main() { +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:8}:"" + return 0; +} + +// expected-error@+3 {{redefinition of 'main'}} +// expected-error@+2 {{'main' is not allowed to be declared inline}} +// expected-note@+1 {{previous definition is here}} +inline int main() { +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:8}:"" + return 0; +} + +// expected-error@+3 {{redefinition of 'main'}} +// expected-warning@+2 {{'main' is not allowed to be declared _Noreturn}} +// expected-note@+1 {{remove '_Noreturn'}} +_Noreturn int main() { +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:11}:"" + return 0; +} + |