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