Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -8156,6 +8156,8 @@ "feature, not permitted in C++">; def err_type_unsupported : Error< "%0 is not supported on this target">; +def err_ocl_type_reserved : Error< + "'%0' is a reserved type in OpenCL">; def err_nsconsumed_attribute_mismatch : Error< "overriding method has mismatched ns_consumed attribute on its" " parameter">; Index: lib/Sema/SemaType.cpp =================================================================== --- lib/Sema/SemaType.cpp +++ lib/Sema/SemaType.cpp @@ -1363,6 +1363,11 @@ else S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_c99_longlong); } + else if (S.getLangOpts().OpenCL) { + // OpenCL v2.0 s6.1.4: 'long long' is a reserved data type. + S.Diag(DS.getTypeSpecWidthLoc(), diag::err_ocl_type_reserved) + << "long long"; + } break; } } else { @@ -1382,6 +1387,11 @@ else S.Diag(DS.getTypeSpecWidthLoc(), diag::ext_c99_longlong); } + else if (S.getLangOpts().OpenCL) { + // OpenCL v2.0 s6.1.4: 'unsigned long long' is a reserved data type. + S.Diag(DS.getTypeSpecWidthLoc(), diag::err_ocl_type_reserved) + << "unsigned long long"; + } break; } } @@ -1399,9 +1409,14 @@ case DeclSpec::TST_half: Result = Context.HalfTy; break; case DeclSpec::TST_float: Result = Context.FloatTy; break; case DeclSpec::TST_double: - if (DS.getTypeSpecWidth() == DeclSpec::TSW_long) + if (DS.getTypeSpecWidth() == DeclSpec::TSW_long) { Result = Context.LongDoubleTy; - else + if (S.getLangOpts().OpenCL) { + // OpenCL v2.0 s6.1.4: 'long double' is a reserved data type. + S.Diag(DS.getTypeSpecWidthLoc(), diag::err_ocl_type_reserved) + << "long double"; + } + } else Result = Context.DoubleTy; break; case DeclSpec::TST_float128: Index: test/Misc/languageOptsOpenCL.cl =================================================================== --- test/Misc/languageOptsOpenCL.cl +++ test/Misc/languageOptsOpenCL.cl @@ -8,14 +8,12 @@ int v1[(__alignof(int)== 4) - 1]; int v2[(sizeof(long) == 8) - 1]; int v3[(__alignof(long)== 8) - 1]; - int v4[(sizeof(long long) == 16) - 1]; - int v5[(__alignof(long long)== 16) - 1]; - int v6[(sizeof(float) == 4) - 1]; - int v7[(__alignof(float)== 4) - 1]; + int v4[(sizeof(float) == 4) - 1]; + int v5[(__alignof(float)== 4) - 1]; #pragma OPENCL EXTENSION cl_khr_fp64 : enable - int v8[(sizeof(double) == 8) - 1]; - int v9[(__alignof(double)== 8) - 1]; + int v6[(sizeof(double) == 8) - 1]; + int v7[(__alignof(double)== 8) - 1]; #pragma OPENCL EXTENSION cl_khr_fp16 : enable - int v10[(sizeof(half) == 2) - 1]; - int v11[(__alignof(half) == 2) - 1]; + int v8[(sizeof(half) == 2) - 1]; + int v9[(__alignof(half) == 2) - 1]; } Index: test/SemaOpenCL/unsupported.cl =================================================================== --- test/SemaOpenCL/unsupported.cl +++ test/SemaOpenCL/unsupported.cl @@ -11,3 +11,10 @@ void no_logxor(int n) { int logxor = n ^^ n; // expected-error {{^^ is a reserved operator in OpenCL}} } + +#pragma OPENCL EXTENSION cl_khr_fp64 : enable + +kernel void no_long_double(global long double *n) {} // expected-error {{'long double' is a reserved type in OpenCL}} + +kernel void no_long_long(global long long *n) {} // expected-error {{'long long' is a reserved type in OpenCL}} +kernel void no_unsigned_long_long(global unsigned long long *n) {} // expected-error {{'unsigned long long' is a reserved type in OpenCL}}