Index: test/Parser/cl_storage_class.cl
===================================================================
--- test/Parser/cl_storage_class.cl	(revision 0)
+++ test/Parser/cl_storage_class.cl	(revision 0)
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 %s -x cl -verify
+
+void test_storage_class_specs()
+{
+  static int a;    // expected-error {{OpenCL does not support the 'static' storage class specifier}}
+  register int b;  // expected-error {{OpenCL does not support the 'register' storage class specifier}}
+  extern int c;    // expected-error {{OpenCL does not support the 'extern' storage class specifier}}
+  auto int d;      // expected-error {{OpenCL does not support the 'auto' storage class specifier}}
+}
Index: include/clang/Basic/DiagnosticParseKinds.td
===================================================================
--- include/clang/Basic/DiagnosticParseKinds.td	(revision 120184)
+++ include/clang/Basic/DiagnosticParseKinds.td	(working copy)
@@ -421,5 +421,14 @@
 def warn_pragma_unused_expected_punc : Warning<
   "expected ')' or ',' in '#pragma unused'">;
 
+// OpenCL Section 6.8.g
+def err_no_kw_static_in_opencl : Error<
+  "OpenCL does not support the 'static' storage class specifier">;
+def err_no_kw_extern_in_opencl : Error<
+  "OpenCL does not support the 'extern' storage class specifier">;
+def err_no_kw_auto_in_opencl : Error<
+  "OpenCL does not support the 'auto' storage class specifier">;
+def err_no_kw_register_in_opencl : Error<
+  "OpenCL does not support the 'register' storage class specifier">;
 } // end of Parse Issue category.
 } // end of Parser diagnostics
Index: lib/Parse/ParseDecl.cpp
===================================================================
--- lib/Parse/ParseDecl.cpp	(revision 120184)
+++ lib/Parse/ParseDecl.cpp	(working copy)
@@ -1224,6 +1224,8 @@
                                          DiagID);
       break;
     case tok::kw_extern:
+      if (getLang().OpenCL)
+        Diag(Tok, diag::err_no_kw_extern_in_opencl);
       if (DS.isThreadSpecified())
         Diag(Tok, diag::ext_thread_before) << "extern";
       isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_extern, Loc, PrevSpec,
@@ -1234,12 +1236,16 @@
                                          PrevSpec, DiagID);
       break;
     case tok::kw_static:
+      if (getLang().OpenCL)
+        Diag(Tok, diag::err_no_kw_static_in_opencl);
       if (DS.isThreadSpecified())
         Diag(Tok, diag::ext_thread_before) << "static";
       isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_static, Loc, PrevSpec,
                                          DiagID);
       break;
     case tok::kw_auto:
+      if (getLang().OpenCL)
+        Diag(Tok, diag::err_no_kw_auto_in_opencl);
       if (getLang().CPlusPlus0x)
         isInvalid = DS.SetTypeSpecType(DeclSpec::TST_auto, Loc, PrevSpec,
                                        DiagID);
@@ -1248,6 +1254,8 @@
                                            DiagID);
       break;
     case tok::kw_register:
+      if (getLang().OpenCL)
+        Diag(Tok, diag::err_no_kw_register_in_opencl);
       isInvalid = DS.SetStorageClassSpec(DeclSpec::SCS_register, Loc, PrevSpec,
                                          DiagID);
       break;
