Test cases for the new diagnostics? ~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
