From bff62031529e651942326b13596b34fd4d96bac7 Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Thu, 21 Oct 2010 16:57:46 +0000 Subject: [PATCH] Always treat 'main' as an extern "C" function, so that we detect redeclarations of main appropriately rather than allowing it to be overloaded. Also, disallowing declaring main as a template. Fixes GCC DejaGNU g++.old-deja/g++.other/main1.C. llvm-svn: 117029 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 1 + clang/include/clang/Sema/Sema.h | 2 +- clang/lib/AST/Decl.cpp | 2 +- clang/lib/Sema/SemaDecl.cpp | 5 +++++ clang/test/CXX/basic/basic.start/basic.start.main/p2h.cpp | 5 +++++ 5 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 clang/test/CXX/basic/basic.start/basic.start.main/p2h.cpp diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 9008b346c92a..87d2a9f81f8b 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -229,6 +229,7 @@ def warn_unusual_main_decl : Warning<"'main' should not be declared " "%select{static|inline|static or inline}0">; def err_unusual_main_decl : Error<"'main' is not allowed to be declared " "%select{static|inline|static or inline}0">; +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': " "must be 0, 2, or 3">; diff --git a/clang/include/clang/Sema/Sema.h b/clang/include/clang/Sema/Sema.h index 108353f53b00..7670316b9d7d 100644 --- a/clang/include/clang/Sema/Sema.h +++ b/clang/include/clang/Sema/Sema.h @@ -964,7 +964,7 @@ public: Ovl_NonFunction }; OverloadKind CheckOverload(Scope *S, - FunctionDecl *New, + FunctionDecl *New, const LookupResult &OldDecls, NamedDecl *&OldDecl, bool IsForUsingDecl); diff --git a/clang/lib/AST/Decl.cpp b/clang/lib/AST/Decl.cpp index 4898d6f2fc0c..5a1edbd0e671 100644 --- a/clang/lib/AST/Decl.cpp +++ b/clang/lib/AST/Decl.cpp @@ -1001,7 +1001,7 @@ bool FunctionDecl::isExternC() const { break; } - return false; + return isMain(); } bool FunctionDecl::isGlobal() const { diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index 57cbb46480b0..f1045d3c0b7a 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -4182,6 +4182,11 @@ void Sema::CheckMain(FunctionDecl* FD) { if (nparams == 1 && !FD->isInvalidDecl()) { Diag(FD->getLocation(), diag::warn_main_one_arg); } + + if (!FD->isInvalidDecl() && FD->getDescribedFunctionTemplate()) { + Diag(FD->getLocation(), diag::err_main_template_decl); + FD->setInvalidDecl(); + } } bool Sema::CheckForConstantInitializer(Expr *Init, QualType DclT) { diff --git a/clang/test/CXX/basic/basic.start/basic.start.main/p2h.cpp b/clang/test/CXX/basic/basic.start/basic.start.main/p2h.cpp new file mode 100644 index 000000000000..abf8faa968cf --- /dev/null +++ b/clang/test/CXX/basic/basic.start/basic.start.main/p2h.cpp @@ -0,0 +1,5 @@ +// RUN: %clang_cc1 -fsyntax-only -verify %s + +template +int main() { } // expected-error{{'main' cannot be a template}} + -- GitLab