aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-02-06 21:20:34 +0000
committerChris Lattner <sabre@nondot.org>2008-02-06 21:20:34 +0000
commitc8edf6bd5f76bf50411d037c83d36847edfa68f0 (patch)
treea0c9b7491e488438c88f1618965a7ad6bfb1fdf6
parentdac2b54b1c6e91569585ef9904295feda2ef3ae9 (diff)
explicitly document that return statement argument does not necessarily follow the result type of the function. Add testcase.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@46823 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/Stmt.h9
-rw-r--r--test/CodeGen/statements.c8
2 files changed, 14 insertions, 3 deletions
diff --git a/include/clang/AST/Stmt.h b/include/clang/AST/Stmt.h
index dae7fbf49b..e92c4faea7 100644
--- a/include/clang/AST/Stmt.h
+++ b/include/clang/AST/Stmt.h
@@ -722,7 +722,14 @@ public:
};
-/// ReturnStmt - This represents a return, optionally of an expression.
+/// ReturnStmt - This represents a return, optionally of an expression:
+/// return;
+/// return 4;
+///
+/// Note that GCC allows return with no argument in a function declared to
+/// return a value, and it allows returning a value in functions declared to
+/// return void. We explicitly model this in the AST, which means you can't
+/// depend on the return type of the function and the presence of an argument.
///
class ReturnStmt : public Stmt {
Expr *RetExpr;
diff --git a/test/CodeGen/statements.c b/test/CodeGen/statements.c
index 46d19dbc52..4092121393 100644
--- a/test/CodeGen/statements.c
+++ b/test/CodeGen/statements.c
@@ -1,9 +1,13 @@
-// RUN: clang %s -emit-llvm
+// RUN: clang < %s -emit-llvm
-void foo(int x) {
+void test1(int x) {
switch (x) {
case 111111111111111111111111111111111111111:
bar();
}
}
+// Mismatched type between return and function result.
+int test2() { return; }
+void test3() { return 4; }
+