r199782 - Enforce restrictions that 'main' is not allowed to be deleted, or to be used by
Richard Smith
metafoo at gmail.com
Tue Jan 21 18:10:36 PST 2014
On Tue Jan 21 2014 at 5:51:27 PM, Aaron Ballman <aaron at aaronballman.com>
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
> <richard-llvm at metafoo.co.uk> 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
> > cfe-commits at cs.uiuc.edu
> > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140122/51ee4e8f/attachment.html>
More information about the cfe-commits
mailing list