Add a warning for 'main' returning 'true' or 'false'.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 29 Nov 2016 01:35:17 +0000 (01:35 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Tue, 29 Nov 2016 01:35:17 +0000 (01:35 +0000)
Patch by Joshua Hurwitz!

llvm-svn: 288097

clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/lib/Sema/SemaStmt.cpp
clang/test/Sema/warn-main-returns-bool-literal.cpp [new file with mode: 0644]

index 9b81a55..beba4a3 100644 (file)
@@ -646,6 +646,8 @@ def warn_main_one_arg : Warning<"only one parameter on 'main' declaration">,
 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 warn_main_returns_bool_literal : Warning<"bool literal returned from "
+    "'main'">, InGroup<Main>;
 def err_main_global_variable :
     Error<"main cannot be declared as global variable">;
 def warn_main_redefined : Warning<"variable named 'main' with external linkage "
index eba192d..79ad049 100644 (file)
@@ -3193,6 +3193,10 @@ StmtResult Sema::BuildReturnStmt(SourceLocation ReturnLoc, Expr *RetValExp) {
     if (FD->isNoReturn())
       Diag(ReturnLoc, diag::warn_noreturn_function_has_return_expr)
         << FD->getDeclName();
+    if (FD->isMain() && RetValExp)
+      if (isa<CXXBoolLiteralExpr>(RetValExp))
+        Diag(ReturnLoc, diag::warn_main_returns_bool_literal)
+          << RetValExp->getSourceRange();
   } else if (ObjCMethodDecl *MD = getCurMethodDecl()) {
     FnRetType = MD->getReturnType();
     isObjCMethod = true;
diff --git a/clang/test/Sema/warn-main-returns-bool-literal.cpp b/clang/test/Sema/warn-main-returns-bool-literal.cpp
new file mode 100644 (file)
index 0000000..188f161
--- /dev/null
@@ -0,0 +1,20 @@
+// RUN: %clang_cc1 -std=c++11 -fsyntax-only -Wmain -verify %s
+
+// expected-note@+1 {{previous definition is here}}
+int main() {
+  return 0;
+}  // no-warning
+
+// expected-error@+1 {{redefinition of 'main'}}
+int main() {
+  return 1.0;
+}  // no-warning
+
+int main() {
+  bool b = true;
+  return b;  // no-warning
+}
+
+int main() {
+  return true;  // expected-warning {{bool literal returned from 'main'}}
+}