On Tue Jan 21 2014 at 5:51:27 PM, Aaron Ballman <[email protected]> wrote:
> Test cases for the new diagnostics? > Oops, forgot to svn add. In r199783, thanks! > ~Aaron > > On Tue, Jan 21, 2014 at 8:43 PM, Richard Smith > <[email protected]> wrote: > > Author: rsmith > > Date: Tue Jan 21 19:43:19 2014 > > New Revision: 199782 > > > > URL: http://llvm.org/viewvc/llvm-project?rev=199782&view=rev > > Log: > > Enforce restrictions that 'main' is not allowed to be deleted, or to be > used by > > the program, in C++. (We allow the latter as an extension, since we've > always > > permitted it, and GCC does the same, and our supported C++ ABIs don't do > > anything special in main.) > > > > Modified: > > cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > > cfe/trunk/lib/Sema/SemaDecl.cpp > > cfe/trunk/lib/Sema/SemaDeclCXX.cpp > > cfe/trunk/lib/Sema/SemaExpr.cpp > > > > Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/ > DiagnosticSemaKinds.td?rev=199782&r1=199781&r2=199782&view=diff > > ============================================================ > ================== > > --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original) > > +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Tue Jan 21 > 19:43:19 2014 > > @@ -425,6 +425,7 @@ def ext_noreturn_main : ExtWarn< > > def note_main_remove_noreturn : Note<"remove '_Noreturn'">; > > def err_constexpr_main : Error< > > "'main' is not allowed to be declared constexpr">; > > +def err_deleted_main : Error<"'main' is not allowed to be deleted">; > > def err_mainlike_template_decl : Error<"%0 cannot be a template">; > > def err_main_returns_nonint : Error<"'main' must return 'int'">; > > def ext_main_returns_nonint : ExtWarn<"return type of 'main' is not > 'int'">, > > @@ -437,6 +438,8 @@ def warn_main_one_arg : Warning<"only on > > def err_main_arg_wrong : Error<"%select{first|second|third|fourth}0 " > > "parameter of 'main' (%select{argument count|argument > array|environment|" > > "platform-specific data}0) must be of type %1">; > > +def ext_main_used : Extension< > > + "ISO C++ does not allow 'main' to be used by a program">, > InGroup<Main>; > > > > /// parser diagnostics > > def ext_no_declarators : ExtWarn<"declaration does not declare > anything">, > > > > Modified: cfe/trunk/lib/Sema/SemaDecl.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/ > SemaDecl.cpp?rev=199782&r1=199781&r2=199782&view=diff > > ============================================================ > ================== > > --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) > > +++ cfe/trunk/lib/Sema/SemaDecl.cpp Tue Jan 21 19:43:19 2014 > > @@ -6809,6 +6809,8 @@ Sema::ActOnFunctionDeclarator(Scope *S, > > } > > > > // If a function is defined as defaulted or deleted, mark it as > such now. > > + // FIXME: Does this ever happen? ActOnStartOfFunctionDef forces the > function > > + // definition kind to FDK_Definition. > > switch (D.getFunctionDefinitionKind()) { > > case FDK_Declaration: > > case FDK_Definition: > > @@ -7670,8 +7672,9 @@ static SourceRange getResultSourceRange( > > } > > > > 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. > > + // C++11 [basic.start.main]p3: > > + // A program that [...] declares main to be inline, static or > > + // constexpr is ill-formed. > > // C11 6.7.4p4: In a hosted environment, no function specifier(s) > shall > > // appear in a declaration of main. > > // static main is not an error under C99, but we should warn about it. > > > > Modified: cfe/trunk/lib/Sema/SemaDeclCXX.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/ > SemaDeclCXX.cpp?rev=199782&r1=199781&r2=199782&view=diff > > ============================================================ > ================== > > --- cfe/trunk/lib/Sema/SemaDeclCXX.cpp (original) > > +++ cfe/trunk/lib/Sema/SemaDeclCXX.cpp Tue Jan 21 19:43:19 2014 > > @@ -11984,6 +11984,11 @@ void Sema::SetDeclDeleted(Decl *Dcl, Sou > > } > > } > > > > + // C++11 [basic.start.main]p3: > > + // A program that defines main as deleted [...] is ill-formed. > > + if (Fn->isMain()) > > + Diag(DelLoc, diag::err_deleted_main); > > + > > Fn->setDeletedAsWritten(); > > } > > > > > > Modified: cfe/trunk/lib/Sema/SemaExpr.cpp > > URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/ > SemaExpr.cpp?rev=199782&r1=199781&r2=199782&view=diff > > ============================================================ > ================== > > --- cfe/trunk/lib/Sema/SemaExpr.cpp (original) > > +++ cfe/trunk/lib/Sema/SemaExpr.cpp Tue Jan 21 19:43:19 2014 > > @@ -264,13 +264,18 @@ bool Sema::DiagnoseUseOfDecl(NamedDecl * > > SmallVectorImpl<PartialDiagnosticAt> &Suppressed = Pos->second; > > for (unsigned I = 0, N = Suppressed.size(); I != N; ++I) > > Diag(Suppressed[I].first, Suppressed[I].second); > > - > > + > > // Clear out the list of suppressed diagnostics, so that we don't > emit > > // them again for this specialization. However, we don't obsolete > this > > // entry from the table, because we want to avoid ever emitting > these > > // diagnostics again. > > Suppressed.clear(); > > } > > + > > + // C++ [basic.start.main]p3: > > + // The function 'main' shall not be used within a program. > > + if (cast<FunctionDecl>(D)->isMain()) > > + Diag(Loc, diag::ext_main_used); > > } > > > > // See if this is an auto-typed variable whose initializer we are > parsing. > > > > > > _______________________________________________ > > 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
