r199782 - Enforce restrictions that 'main' is not allowed to be deleted, or to be used by

David Blaikie dblaikie at gmail.com
Tue Jan 21 18:47:33 PST 2014


On Tue, Jan 21, 2014 at 5: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.
>

One way to find out is to replace this with an assert that it doesn't
happen and wait for a buildbot (or, if one was more socially responsible
than me, run various test loads out-of-tree on the change) to fail...


>      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/20140121/162d5a0c/attachment.html>


More information about the cfe-commits mailing list