forked from OSchip/llvm-project
parent
abb26bae4e
commit
3f333f2edf
|
@ -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': "
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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}}
|
Loading…
Reference in New Issue