Index: test/SemaOpenCL/kernel-errors.cl
===================================================================
--- test/SemaOpenCL/kernel-errors.cl	(revision 0)
+++ test/SemaOpenCL/kernel-errors.cl	(revision 0)
@@ -0,0 +1,5 @@
+// RUN: %clang_cc1 -fsyntax-only -pedantic -verify %s
+
+__kernel int bar()  { // expected-error {{kernel function must return void}}
+  return 6;
+}
Index: include/clang/Basic/DiagnosticSemaKinds.td
===================================================================
--- include/clang/Basic/DiagnosticSemaKinds.td	(revision 173469)
+++ include/clang/Basic/DiagnosticSemaKinds.td	(working copy)
@@ -6105,6 +6105,8 @@
   "the event_t type cannot be used to declare a structure or union field">;
 def err_event_t_addr_space_qual : Error<
   "the event_t type can only be used with __private address space qualifier">;
+def err_expected_kernel_void_return_type : Error<
+  "kernel function must return void">;
 
 } // end of sema category
 
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp	(revision 173469)
+++ lib/Sema/SemaDecl.cpp	(working copy)
@@ -6178,7 +6178,15 @@
       Diag(D.getIdentifierLoc(), diag::err_static_kernel);
       D.setInvalidType();
     }
-
+    
+    // OpenCL v1.2, s6.9 -- Kernels can only have return type void.
+    if (!NewFD->getResultType()->isVoidType() &&
+        !NewFD->getAttr<SectionAttr>()) {
+      Diag(D.getIdentifierLoc(),
+           diag::err_expected_kernel_void_return_type);
+      D.setInvalidType();
+    }
+    
     // OpenCL v1.2 s6.8 n:
     // Arguments to kernel functions in a program cannot be declared to be of
     // type event_t.
