Index: include/clang/Basic/DiagnosticSemaKinds.td =================================================================== --- include/clang/Basic/DiagnosticSemaKinds.td +++ include/clang/Basic/DiagnosticSemaKinds.td @@ -7844,13 +7844,13 @@ def err_opencl_invalid_access_qualifier : Error< "access qualifier can only be used for pipe and image type">; def err_opencl_invalid_read_write : Error< - "access qualifier %0 can not be used for %1 %select{|earlier than OpenCL2.0 version}2">; + "access qualifier %0 can not be used for %1 %select{|earlier than OpenCL version 2.0}2">; def err_opencl_multiple_access_qualifiers : Error< "multiple access qualifiers">; // OpenCL Section 6.8.g def err_opencl_unknown_type_specifier : Error< - "OpenCL does not support the '%0' %select{type qualifier|storage class specifier}1">; + "OpenCL version %0 does not support the '%1' %select{type qualifier|storage class specifier}2">; // OpenCL v2.0 s6.12.5 Blocks restrictions def err_opencl_block_storage_type : Error< Index: lib/Parse/ParseDecl.cpp =================================================================== --- lib/Parse/ParseDecl.cpp +++ lib/Parse/ParseDecl.cpp @@ -28,6 +28,7 @@ #include "llvm/ADT/SmallSet.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/StringSwitch.h" +#include "llvm/ADT/Twine.h" using namespace clang; @@ -3507,8 +3508,12 @@ if (DiagID == diag::ext_duplicate_declspec) Diag(Tok, DiagID) << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation()); - else if (DiagID == diag::err_opencl_unknown_type_specifier) - Diag(Tok, DiagID) << PrevSpec << isStorageClass; + else if (DiagID == diag::err_opencl_unknown_type_specifier) { + Twine VerMinor ((getLangOpts().OpenCLVersion % 100) / 10); + Twine VerMajor (getLangOpts().OpenCLVersion / 100); + const char *VerSpec = (VerMajor + Twine ('.') + VerMinor).str().c_str(); + Diag(Tok, DiagID) << VerSpec << PrevSpec << isStorageClass; + } else Diag(Tok, DiagID) << PrevSpec; } Index: test/Parser/opencl-cl20.cl =================================================================== --- test/Parser/opencl-cl20.cl +++ test/Parser/opencl-cl20.cl @@ -10,9 +10,9 @@ return var; } #ifndef CL20 -// expected-error@-5 {{OpenCL does not support the '__generic' type qualifier}} -// expected-error@-6 {{OpenCL does not support the '__generic' type qualifier}} -// expected-error@-6 {{OpenCL does not support the '__generic' type qualifier}} +// expected-error@-5 {{OpenCL version 1.0 the '__generic' type qualifier}} +// expected-error@-6 {{OpenCL version 1.0 the '__generic' type qualifier}} +// expected-error@-6 {{OpenCL version 1.0 the '__generic' type qualifier}} #endif generic int * generic_test(generic int *arg) { @@ -20,7 +20,7 @@ return var; } #ifndef CL20 -// expected-error@-5 {{OpenCL does not support the 'generic' type qualifier}} -// expected-error@-6 {{OpenCL does not support the 'generic' type qualifier}} -// expected-error@-6 {{OpenCL does not support the 'generic' type qualifier}} +// expected-error@-5 {{OpenCL version 1.0 the 'generic' type qualifier}} +// expected-error@-6 {{OpenCL version 1.0 the 'generic' type qualifier}} +// expected-error@-6 {{OpenCL version 1.0 the 'generic' type qualifier}} #endif Index: test/Parser/opencl-storage-class.cl =================================================================== --- test/Parser/opencl-storage-class.cl +++ test/Parser/opencl-storage-class.cl @@ -2,10 +2,10 @@ 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}} + static int a; // expected-error {{OpenCL version 1.0 the 'static' storage class specifier}} + register int b; // expected-error {{OpenCL version 1.0 the 'register' storage class specifier}} + extern int c; // expected-error {{OpenCL version 1.0 the 'extern' storage class specifier}} + auto int d; // expected-error {{OpenCL version 1.0 the 'auto' storage class specifier}} #pragma OPENCL EXTENSION cl_clang_storage_class_specifiers : enable static int e; // expected-error {{static local variable must reside in constant address space}} Index: test/SemaOpenCL/invalid-access-qualifier.cl =================================================================== --- test/SemaOpenCL/invalid-access-qualifier.cl +++ test/SemaOpenCL/invalid-access-qualifier.cl @@ -10,5 +10,5 @@ #ifdef CL20 void test4(read_write pipe int i){} // expected-error{{access qualifier 'read_write' can not be used for 'pipe'}} #else -void test4(__read_write image1d_t i) {} // expected-error{{access qualifier '__read_write' can not be used for '__read_write image1d_t' earlier than OpenCL2.0 version}} +void test4(__read_write image1d_t i) {} // expected-error{{access qualifier '__read_write' can not be used for '__read_write image1d_t' earlier than OpenCL version 2.0}} #endif Index: test/SemaOpenCL/storageclass.cl =================================================================== --- test/SemaOpenCL/storageclass.cl +++ test/SemaOpenCL/storageclass.cl @@ -13,7 +13,7 @@ constant int L1 = 0; local int L2; - auto int L3 = 7; // expected-error{{OpenCL does not support the 'auto' storage class specifier}} + auto int L3 = 7; // expected-error{{OpenCL version 1.2 does not support the 'auto' storage class specifier}} global int L4; // expected-error{{function scope variable cannot be declared in global address space}} }