On Wed, Jan 16, 2013 at 4:26 PM, Dmitri Gribenko <[email protected]> wrote: > Author: gribozavr > Date: Wed Jan 16 18:26:13 2013 > New Revision: 172684 > > URL: http://llvm.org/viewvc/llvm-project?rev=172684&view=rev > Log: > Implement a fixit for -Wmain-return-type
Addresses one part of PR8104, for what it's worth. > > Added: > cfe/trunk/test/Sema/warn-main-return-type.c > Modified: > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > cfe/trunk/lib/Sema/SemaDecl.cpp > cfe/trunk/test/Sema/gnu89.c > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=172684&r1=172683&r2=172684&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Jan 16 18:26:13 > 2013 > @@ -392,6 +392,7 @@ > def err_main_returns_nonint : Error<"'main' must return 'int'">; > def ext_main_returns_nonint : ExtWarn<"return type of 'main' is not 'int'">, > InGroup<MainReturnType>; > +def note_main_change_return_type : Note<"change return type to 'int'">; > def err_main_surplus_args : Error<"too many parameters (%0) for 'main': " > "must be 0, 2, or 3">; > def warn_main_one_arg : Warning<"only one parameter on 'main' declaration">, > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=172684&r1=172683&r2=172684&view=diff > ============================================================================== > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Wed Jan 16 18:26:13 2013 > @@ -6397,6 +6397,23 @@ > return Redeclaration; > } > > +static SourceRange getResultSourceRange(const FunctionDecl *FD) { > + const TypeSourceInfo *TSI = FD->getTypeSourceInfo(); > + if (!TSI) > + return SourceRange(); > + > + TypeLoc TL = TSI->getTypeLoc(); > + FunctionTypeLoc *FunctionTL = dyn_cast<FunctionTypeLoc>(&TL); > + if (!FunctionTL) > + return SourceRange(); > + > + TypeLoc ResultTL = FunctionTL->getResultLoc(); > + if (isa<BuiltinTypeLoc>(ResultTL.getUnqualifiedLoc())) > + return ResultTL.getSourceRange(); > + > + return SourceRange(); > +} > + > void Sema::CheckMain(FunctionDecl* FD, const DeclSpec& DS) { > // C++11 [basic.start.main]p3: A program that declares main to be inline, > // static or constexpr is ill-formed. > @@ -6433,9 +6450,20 @@ > } else if (getLangOpts().GNUMode && !getLangOpts().CPlusPlus) { > Diag(FD->getTypeSpecStartLoc(), diag::ext_main_returns_nonint); > > + SourceRange ResultRange = getResultSourceRange(FD); > + if (ResultRange.isValid()) > + Diag(ResultRange.getBegin(), diag::note_main_change_return_type) > + << FixItHint::CreateReplacement(ResultRange, "int"); > + > // Otherwise, this is just a flat-out error. > } else { > - Diag(FD->getTypeSpecStartLoc(), diag::err_main_returns_nonint); > + SourceRange ResultRange = getResultSourceRange(FD); > + if (ResultRange.isValid()) > + Diag(FD->getTypeSpecStartLoc(), diag::err_main_returns_nonint) > + << FixItHint::CreateReplacement(ResultRange, "int"); > + else > + Diag(FD->getTypeSpecStartLoc(), diag::err_main_returns_nonint); > + > FD->setInvalidDecl(true); > } > > > Modified: cfe/trunk/test/Sema/gnu89.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/gnu89.c?rev=172684&r1=172683&r2=172684&view=diff > ============================================================================== > --- cfe/trunk/test/Sema/gnu89.c (original) > +++ cfe/trunk/test/Sema/gnu89.c Wed Jan 16 18:26:13 2013 > @@ -2,4 +2,4 @@ > > int f(int restrict); > > -void main() {} // expected-warning {{return type of 'main' is not 'int'}} > +void main() {} // expected-warning {{return type of 'main' is not 'int'}} > expected-note {{change return type to 'int'}} > > Added: cfe/trunk/test/Sema/warn-main-return-type.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-main-return-type.c?rev=172684&view=auto > ============================================================================== > --- cfe/trunk/test/Sema/warn-main-return-type.c (added) > +++ cfe/trunk/test/Sema/warn-main-return-type.c Wed Jan 16 18:26:13 2013 > @@ -0,0 +1,49 @@ > +// 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 5{{previous definition is here}} > +int main() { > + return 0; > +} > + > +// expected-error@+3 {{conflicting types for 'main}} > +// expected-warning@+2 {{return type of 'main' is not 'int'}} > +// expected-note@+1 {{change return type to 'int'}} > +void main() { > +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:5}:"int" > +} > + > +// expected-error@+3 {{conflicting types for 'main}} > +// expected-warning@+2 {{return type of 'main' is not 'int'}} > +// expected-note@+1 {{change return type to 'int'}} > +double main() { > +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:1-[[@LINE-1]]:7}:"int" > + return 0.0; > +} > + > +// Currently we suggest to replace only 'float' here because we don't store > +// enough source locations. > +// > +// expected-error@+3 {{conflicting types for 'main}} > +// expected-warning@+2 {{return type of 'main' is not 'int'}} > +// expected-note@+1 {{change return type to 'int'}} > +const float main() { > +// CHECK: fix-it:"{{.*}}":{[[@LINE-1]]:7-[[@LINE-1]]:12}:"int" > + return 0.0f; > +} > + > +typedef void *(*fptr)(int a); > + > +// expected-error@+2 {{conflicting types for 'main}} > +// expected-warning@+1 {{return type of 'main' is not 'int'}} > +fptr main() { > + return (fptr) 0; > +} > + > +// expected-error@+2 {{conflicting types for 'main}} > +// expected-warning@+1 {{return type of 'main' is not 'int'}} > +void *(*main())(int a) { > + return (fptr) 0; > +} > + > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
