Disallow constexpr main.

llvm-svn: 149770
This commit is contained in:
Richard Smith 2012-02-04 06:10:17 +00:00
parent abb26bae4e
commit 3f333f2edf
3 changed files with 15 additions and 2 deletions

View File

@ -330,6 +330,8 @@ def warn_static_main : Warning<"'main' should not be declared static">,
InGroup<Main>;
def err_static_main : Error<"'main' is not allowed to be declared static">;
def err_inline_main : Error<"'main' is not allowed to be declared inline">;
def err_constexpr_main : Error<
"'main' is not allowed to be declared constexpr">;
def err_main_template_decl : Error<"'main' cannot be a template">;
def err_main_returns_nonint : Error<"'main' must return 'int'">;
def err_main_surplus_args : Error<"too many parameters (%0) for 'main': "

View File

@ -5778,8 +5778,8 @@ bool Sema::CheckFunctionDeclaration(Scope *S, FunctionDecl *NewFD,
}
void Sema::CheckMain(FunctionDecl* FD, const DeclSpec& DS) {
// C++ [basic.start.main]p3: A program that declares main to be inline
// or static is ill-formed.
// C++11 [basic.start.main]p3: A program that declares main to be inline,
// static or constexpr is ill-formed.
// C99 6.7.4p4: In a hosted environment, the inline function specifier
// shall not appear in a declaration of main.
// static main is not an error under C99, but we should warn about it.
@ -5790,6 +5790,11 @@ void Sema::CheckMain(FunctionDecl* FD, const DeclSpec& DS) {
if (FD->isInlineSpecified())
Diag(DS.getInlineSpecLoc(), diag::err_inline_main)
<< FixItHint::CreateRemoval(DS.getInlineSpecLoc());
if (FD->isConstexpr()) {
Diag(DS.getConstexprSpecLoc(), diag::err_constexpr_main)
<< FixItHint::CreateRemoval(DS.getConstexprSpecLoc());
FD->setConstexpr(false);
}
QualType T = FD->getType();
assert(T->isFunctionType() && "function decl is not of function type");

View File

@ -0,0 +1,6 @@
// RUN: cp %s %t
// RUN: %clang_cc1 -x c++ %s -std=c++11 -fsyntax-only -verify
// RUN: not %clang_cc1 -x c++ %t -std=c++11 -fixit
// RUN: %clang_cc1 -x c++ %t -std=c++11 -fsyntax-only
constexpr int main() { } // expected-error{{'main' is not allowed to be declared constexpr}}