https://github.com/piotrrak updated 
https://github.com/llvm/llvm-project/pull/153508

>From 7e6c169841ca612e01ca39e9f85ac4f87cf7c9d4 Mon Sep 17 00:00:00 2001
From: Piotr Rak <piotr....@gmail.com>
Date: Wed, 13 Aug 2025 22:00:22 +0200
Subject: [PATCH 1/2] [OpenCLCpp] Avoid inferred adding address-space to
 function types

The default OpenCL address-space was added for function types, which was
breaking transform type builtins for function types, in particular:

- __remove_reference_t
- __remove_cvref
- __remove_pointer

This change fixes SemaCXX/type-traits.cpp pass for clc++ dialect.
(In feature set of clc++ and extension - ie. no VLA, _Atomic etc...)

There is still unaddressed issue with address space of member-fn-ptr
in __is_same trait builtin as address-space specified by user is
ignored on such types.

This is seperate unrelated issue and won't be addressed in this change.
---
 clang/lib/Sema/SemaType.cpp | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp
index 0985b5b565dab..cba71b62bbf33 100644
--- a/clang/lib/Sema/SemaType.cpp
+++ b/clang/lib/Sema/SemaType.cpp
@@ -1793,9 +1793,11 @@ bool Sema::CheckQualifiedFunctionForTypeId(QualType T, 
SourceLocation Loc) {
 }
 
 // Helper to deduce addr space of a pointee type in OpenCL mode.
-static QualType deduceOpenCLPointeeAddrSpace(Sema &S, QualType PointeeType) {
+static QualType deduceOpenCLPointeeAddrSpace(Sema &S, QualType PointeeType,
+                                             bool IsBlock) {
   if (!PointeeType->isUndeducedAutoType() && !PointeeType->isDependentType() &&
       !PointeeType->isSamplerT() &&
+      (!PointeeType->isFunctionType() || IsBlock) &&
       !PointeeType.hasAddressSpace())
     PointeeType = S.getASTContext().getAddrSpaceQualType(
         PointeeType, S.getASTContext().getDefaultOpenCLPointeeAddrSpace());
@@ -1834,7 +1836,7 @@ QualType Sema::BuildPointerType(QualType T,
     T = inferARCLifetimeForPointee(*this, T, Loc, /*reference*/ false);
 
   if (getLangOpts().OpenCL)
-    T = deduceOpenCLPointeeAddrSpace(*this, T);
+    T = deduceOpenCLPointeeAddrSpace(*this, T, /*IsBlock*/ false);
 
   // In WebAssembly, pointers to reference types and pointers to tables are
   // illegal.
@@ -1911,7 +1913,7 @@ QualType Sema::BuildReferenceType(QualType T, bool 
SpelledAsLValue,
     T = inferARCLifetimeForPointee(*this, T, Loc, /*reference*/ true);
 
   if (getLangOpts().OpenCL)
-    T = deduceOpenCLPointeeAddrSpace(*this, T);
+    T = deduceOpenCLPointeeAddrSpace(*this, T, /*IsBlock*/ false);
 
   // In WebAssembly, references to reference types and tables are illegal.
   if (getASTContext().getTargetInfo().getTriple().isWasm() &&
@@ -2766,7 +2768,7 @@ QualType Sema::BuildBlockPointerType(QualType T,
     return QualType();
 
   if (getLangOpts().OpenCL)
-    T = deduceOpenCLPointeeAddrSpace(*this, T);
+    T = deduceOpenCLPointeeAddrSpace(*this, T, /*IsBlock*/ true);
 
   return Context.getBlockPointerType(T);
 }

>From bfd989ddaaa3a3b4861d2acf67de0eeb4a7d8fb2 Mon Sep 17 00:00:00 2001
From: Piotr Rak <piotr....@gmail.com>
Date: Fri, 1 Aug 2025 12:23:54 +0200
Subject: [PATCH 2/2] [OpenCLCpp] Enable type-traits tests for clc++

---
 clang/test/SemaCXX/type-traits.cpp            | 491 ++++++++++++++++--
 .../SemaOpenCLCXX/address-space-traits.clcpp  |  29 ++
 2 files changed, 491 insertions(+), 29 deletions(-)
 create mode 100644 clang/test/SemaOpenCLCXX/address-space-traits.clcpp

diff --git a/clang/test/SemaCXX/type-traits.cpp 
b/clang/test/SemaCXX/type-traits.cpp
index 3f0124755c674..96298f9156f90 100644
--- a/clang/test/SemaCXX/type-traits.cpp
+++ b/clang/test/SemaCXX/type-traits.cpp
@@ -1,8 +1,19 @@
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify 
-std=gnu++11 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted 
-Wno-c++17-extensions  %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify 
-std=gnu++14 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted 
-Wno-c++17-extensions  %s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify 
-std=gnu++17 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted  
%s
-// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only -verify 
-std=gnu++20 -fblocks -Wno-deprecated-builtins -Wno-defaulted-function-deleted  
%s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only 
-verify=expected,expected-noncl -std=gnu++11 -fblocks -Wno-deprecated-builtins 
-Wno-defaulted-function-deleted -Wno-c++17-extensions  %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only 
-verify=expected,expected-noncl -std=gnu++14 -fblocks -Wno-deprecated-builtins 
-Wno-defaulted-function-deleted -Wno-c++17-extensions  %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only 
-verify=expected,expected-noncl -std=gnu++17 -fblocks -Wno-deprecated-builtins 
-Wno-defaulted-function-deleted  %s
+// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -fsyntax-only 
-verify=expected,expected-noncl -std=gnu++20 -fblocks -Wno-deprecated-builtins 
-Wno-defaulted-function-deleted  %s
+// RUN: %clang_cc1 -triple spirv64-none-none -fsyntax-only -fno-rtti 
-verify=expected,expected-cl -cl-std=clc++2021 -Wno-deprecated-builtins 
-Wno-defaulted-function-deleted 
-cl-ext=+__cl_clang_variadic_functions,+__cl_clang_function_pointers,+__cl_clang_bitfields
 -DVANILLAOPENCLCPLUSPLUS %s
+// RUN: %clang_cc1 -triple spirv64-none-none -fsyntax-only -fno-rtti 
-verify=expected,expected-cl -cl-std=clc++2021 -Wno-deprecated-builtins 
-Wno-defaulted-function-deleted 
-cl-ext=+__cl_clang_variadic_functions,+__cl_clang_function_pointers,+__cl_clang_bitfields
 -DEXTOPENCLCPLUSPLUS %s
+
+#if defined(EXTOPENCLCPLUSPLUS)
+#pragma OPENCL EXTENSION __cl_clang_variadic_functions : enable
+#pragma OPENCL EXTENSION __cl_clang_function_pointers : enable
+#pragma OPENCL EXTENSION __cl_clang_bitfields : enable
+#endif
 
+#if defined(EXTOPENCLCPLUSPLUS) || defined(VANILLAOPENCLCPLUSPLUS)
+#pragma OPENCL EXTENSION cl_khr_fp16 : enable
+#endif
 
 struct NonPOD { NonPOD(int); };
 typedef NonPOD NonPODAr[10];
@@ -111,9 +122,16 @@ class  HasProt { protected: int prot; };
 struct HasRef { int i; int& ref; HasRef() : i(0), ref(i) {} };
 struct HasRefAggregate { int i; int& ref; };
 struct HasNonPOD { NonPOD np; };
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+struct HasVirt { virtual void Virt() {}; };
+#else
 struct HasVirt { virtual void Virt() {}; };
+//expected-error@-1 {{virtual functions are not supported in C++ for OpenCL}}
+#endif
 typedef NonPOD NonPODAr[10];
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 typedef HasVirt VirtAr[10];
+#endif
 typedef NonPOD NonPODArNB[];
 union NonPODUnion { int i; Derives n; };
 struct DerivesHasCons : HasCons {};
@@ -123,7 +141,9 @@ struct DerivesHasDest : HasDest {};
 struct DerivesHasPriv : HasPriv {};
 struct DerivesHasProt : HasProt {};
 struct DerivesHasRef : HasRef {};
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct DerivesHasVirt : HasVirt {};
+#endif
 struct DerivesHasMoveCtor : HasMoveCtor {};
 
 struct HasNoThrowCopyAssign {
@@ -161,9 +181,14 @@ struct HasMultipleNoThrowCopy {
   HasMultipleNoThrowCopy(volatile HasMultipleNoThrowCopy&) throw();
 };
 
+#if defined(VANILLAOPENCLCPLUSPLUS)
+struct HasVirtDest { virtual ~HasVirtDest(); };
+//expected-error@-1 {{virtual functions are not supported in C++ for OpenCL}}
+#else
 struct HasVirtDest { virtual ~HasVirtDest(); };
 struct DerivedVirtDest : HasVirtDest {};
 typedef HasVirtDest VirtDestAr[1];
+#endif
 
 class AllPrivate {
   AllPrivate() throw();
@@ -244,13 +269,17 @@ void is_pod()
   static_assert(!__is_pod(HasMoveAssign));
   static_assert(!__is_pod(HasDest));
   static_assert(!__is_pod(HasRef));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_pod(HasVirt));
+#endif
   static_assert(!__is_pod(DerivesHasCons));
   static_assert(!__is_pod(DerivesHasCopyAssign));
   static_assert(!__is_pod(DerivesHasMoveAssign));
   static_assert(!__is_pod(DerivesHasDest));
   static_assert(!__is_pod(DerivesHasRef));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_pod(DerivesHasVirt));
+#endif
   static_assert(!__is_pod(NonPOD));
   static_assert(!__is_pod(HasNonPOD));
   static_assert(!__is_pod(NonPODAr));
@@ -266,11 +295,13 @@ void is_pod()
 }
 
 typedef Empty EmptyAr[10];
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct Bit0 { int : 0; };
 struct Bit0Cons { int : 0; Bit0Cons(); };
 struct AnonBitOnly { int : 3; };
 struct BitOnly { int x : 3; };
 struct DerivesVirt : virtual POD {};
+#endif
 
 void is_empty()
 {
@@ -284,8 +315,10 @@ void is_empty()
   static_assert(__is_empty(HasOp));
   static_assert(__is_empty(HasConv));
   static_assert(__is_empty(HasAssign));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_empty(Bit0));
   static_assert(__is_empty(Bit0Cons));
+#endif
 
   static_assert(!__is_empty(Int));
   static_assert(!__is_empty(POD));
@@ -293,9 +326,11 @@ void is_empty()
   static_assert(!__is_empty(IncompleteUnion));
   static_assert(!__is_empty(EmptyAr));
   static_assert(!__is_empty(HasRef));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_empty(HasVirt));
   static_assert(!__is_empty(AnonBitOnly));
   static_assert(!__is_empty(BitOnly));
+#endif
   static_assert(!__is_empty(void));
   static_assert(!__is_empty(IntArNB));
   static_assert(!__is_empty(HasAnonymousUnion));
@@ -442,13 +477,17 @@ void is_final()
 }
 
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 typedef HasVirt Polymorph;
 struct InheritPolymorph : Polymorph {};
+#endif
 
 void is_polymorphic()
 {
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_polymorphic(Polymorph));
   static_assert(__is_polymorphic(InheritPolymorph));
+#endif
 
   static_assert(!__is_polymorphic(int));
   static_assert(!__is_polymorphic(Union));
@@ -590,8 +629,10 @@ void is_aggregate()
   static_assert(!__is_aggregate(HasProt));
   static_assert(__is_aggregate(HasRefAggregate));
   static_assert(__is_aggregate(HasNonPOD));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_aggregate(HasVirt));
   static_assert(__is_aggregate(VirtAr));
+#endif
   static_assert(__is_aggregate(HasInClassInit) == TrueAfterCpp11);
   static_assert(!__is_aggregate(HasPrivateBase));
   static_assert(!__is_aggregate(HasProtectedBase));
@@ -747,8 +788,10 @@ void is_bounded_array(int n) {
   static_assert(!__is_bounded_array(void *));
   static_assert(!__is_bounded_array(cvoid *));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   int t32[n];
   (void)__is_bounded_array(decltype(t32)); // expected-error{{variable length 
arrays are not supported in '__is_bounded_array'}}
+#endif
 }
 
 void is_unbounded_array(int n) {
@@ -780,8 +823,10 @@ void is_unbounded_array(int n) {
   static_assert(!__is_unbounded_array(void *));
   static_assert(!__is_unbounded_array(cvoid *));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   int t32[n];
   (void)__is_unbounded_array(decltype(t32)); // expected-error{{variable 
length arrays are not supported in '__is_unbounded_array'}}
+#endif
 }
 
 template <typename T> void tmpl_func(T&) {}
@@ -794,10 +839,15 @@ template <typename T> struct type_wrapper {
 
 void is_function()
 {
+#if !defined(VANILLAOPENCLCPLUSPLUS)&& !defined(EXTOPENCLCPLUSPLUS)
+  // Requires RTTI
   static_assert(__is_function(type_wrapper<void(void)>::type));
   static_assert(__is_function(typeof(tmpl_func<int>)));
+#endif
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   typedef void (*ptr_to_func_type)(void);
+#endif
 
   static_assert(!__is_function(void));
   static_assert(!__is_function(cvoid));
@@ -821,10 +871,12 @@ void is_function()
   static_assert(!__is_function(Enum));
   static_assert(!__is_function(void*));
   static_assert(!__is_function(cvoid*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_function(void(*)()));
   static_assert(!__is_function(ptr_to_func_type));
   static_assert(!__is_function(type_wrapper<void(void)>::ptrtype));
   static_assert(!__is_function(type_wrapper<void(void)>::reftype));
+#endif
 }
 
 void is_reference()
@@ -908,7 +960,9 @@ void is_object()
   static_assert(__is_object(ClassType));
   static_assert(__is_object(Enum));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_object(type_wrapper<void(void)>::type));
+#endif
   static_assert(!__is_object(int&));
   static_assert(!__is_object(void));
 }
@@ -951,9 +1005,11 @@ void is_compound()
 {
   static_assert(__is_compound(void*));
   static_assert(__is_compound(cvoid*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_compound(void (*)()));
   static_assert(__is_compound(int StructWithMembers::*));
   static_assert(__is_compound(void (StructWithMembers::*)()));
+#endif
   static_assert(__is_compound(int&));
   static_assert(__is_compound(Union));
   static_assert(__is_compound(UnionAr));
@@ -997,7 +1053,10 @@ void is_pointer()
   static_assert(__is_pointer(Union*));
   static_assert(__is_pointer(UnionAr*));
   static_assert(__is_pointer(StructWithMembers*));
+
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_pointer(void (*)()));
+#endif
 
   static_assert(!__is_pointer(void));
   static_assert(!__is_pointer(cvoid));
@@ -1013,7 +1072,9 @@ void is_pointer()
   static_assert(!__is_pointer(UnionAr));
   static_assert(!__is_pointer(StructWithMembers));
   static_assert(!__is_pointer(int StructWithMembers::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_pointer(void (StructWithMembers::*) ()));
+#endif
 }
 
 void is_member_object_pointer()
@@ -1022,7 +1083,9 @@ void is_member_object_pointer()
 
   static_assert(__is_member_object_pointer(int StructWithMembers::*));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_member_object_pointer(void (StructWithMembers::*) ()));
+#endif
   static_assert(!__is_member_object_pointer(void*));
   static_assert(!__is_member_object_pointer(cvoid*));
   static_assert(!__is_member_object_pointer(cvoid*));
@@ -1049,14 +1112,18 @@ void is_member_object_pointer()
   static_assert(!__is_member_object_pointer(Union));
   static_assert(!__is_member_object_pointer(UnionAr));
   static_assert(!__is_member_object_pointer(StructWithMembers));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_member_object_pointer(void (*)()));
+#endif
 }
 
 void is_member_function_pointer()
 {
   StructWithMembers x;
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_member_function_pointer(void (StructWithMembers::*) ()));
+#endif
 
   static_assert(!__is_member_function_pointer(int StructWithMembers::*));
   static_assert(!__is_member_function_pointer(void*));
@@ -1085,7 +1152,9 @@ void is_member_function_pointer()
   static_assert(!__is_member_function_pointer(Union));
   static_assert(!__is_member_function_pointer(UnionAr));
   static_assert(!__is_member_function_pointer(StructWithMembers));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_member_function_pointer(void (*)()));
+#endif
 }
 
 void is_member_pointer()
@@ -1093,7 +1162,9 @@ void is_member_pointer()
   StructWithMembers x;
 
   static_assert(__is_member_pointer(int StructWithMembers::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_member_pointer(void (StructWithMembers::*) ()));
+#endif
 
   static_assert(!__is_member_pointer(void*));
   static_assert(!__is_member_pointer(cvoid*));
@@ -1121,7 +1192,9 @@ void is_member_pointer()
   static_assert(!__is_member_pointer(Union));
   static_assert(!__is_member_pointer(UnionAr));
   static_assert(!__is_member_pointer(StructWithMembers));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_member_pointer(void (*)()));
+#endif
 }
 
 void is_const()
@@ -1392,12 +1465,14 @@ struct CppStructNonStandardByBase : CStruct {
   int three;
   int four;
 };
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct CppStructNonStandardByVirt : CStruct {
   virtual void method() {}
 };
 struct CppStructNonStandardByMemb : CStruct {
   CppStructNonStandardByVirt member;
 };
+#endif
 struct CppStructNonStandardByProt : CStruct {
   int five;
 protected:
@@ -1429,8 +1504,10 @@ void is_standard_layout()
 
   typedef CppStructNonStandardByBase CppStructNonStandardByBaseAr[4];
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_standard_layout(CppStructNonStandardByVirt));
   static_assert(!__is_standard_layout(CppStructNonStandardByMemb));
+#endif
   static_assert(!__is_standard_layout(CppStructNonStandardByProt));
   static_assert(!__is_standard_layout(CppStructNonStandardByVirtBase));
   static_assert(!__is_standard_layout(CppStructNonStandardByBase));
@@ -1445,6 +1522,7 @@ void is_standard_layout()
   static_assert(!__is_standard_layout(void));
   static_assert(!__is_standard_layout(const volatile void));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   struct HasAnonEmptyBitfield { int : 0; };
   struct HasAnonBitfield { int : 4; };
   struct DerivesFromBitfield : HasAnonBitfield {};
@@ -1456,6 +1534,7 @@ void is_standard_layout()
   static_assert(__is_standard_layout(DerivesFromBitfield));
   static_assert(!__is_standard_layout(DerivesFromBitfieldWithBitfield));
   static_assert(!__is_standard_layout(DerivesFromBitfieldTwice));
+#endif
 
   struct Empty {};
   struct HasEmptyBase : Empty {};
@@ -1467,7 +1546,9 @@ void is_standard_layout()
   struct HasEmptyBaseAsSubobjectOfMember3 : Empty { HoldsEmptyBase e[2]; };
   struct HasEmptyIndirectBaseAsMember : HasEmptyBase { Empty e; };
   struct HasEmptyIndirectBaseAsSecondMember : HasEmptyBase { int n; Empty e; };
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   struct HasEmptyIndirectBaseAfterBitfield : HasEmptyBase { int : 4; Empty e; 
};
+#endif
 
   static_assert(__is_standard_layout(Empty));
   static_assert(__is_standard_layout(HasEmptyBase));
@@ -1478,7 +1559,9 @@ void is_standard_layout()
   static_assert(!__is_standard_layout(HasEmptyBaseAsSubobjectOfMember3));
   static_assert(!__is_standard_layout(HasEmptyIndirectBaseAsMember));
   static_assert(__is_standard_layout(HasEmptyIndirectBaseAsSecondMember));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_standard_layout(HasEmptyIndirectBaseAfterBitfield)); // 
FIXME: standard bug?
+#endif
 
   struct StructWithEmptyFields {
     int n;
@@ -1515,12 +1598,14 @@ struct CppStructNonStandardByBase2 : CStruct2 {
   int three;
   int four;
 };
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct CppStructNonStandardByVirt2 : CStruct2 {
   virtual void method() {}
 };
 struct CppStructNonStandardByMemb2 : CStruct2 {
   CppStructNonStandardByVirt member;
 };
+#endif
 struct CppStructNonStandardByProt2 : CStruct2 {
   int five;
 protected:
@@ -1579,6 +1664,7 @@ struct CStructNested2 {
   int b2;
 };
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct CStructWithBitfelds {
   int a : 5;
   int : 0;
@@ -1598,6 +1684,7 @@ struct CStructWithBitfelds4 {
   EnumLayout a : 5;
   int : 0;
 };
+#endif
 
 union UnionLayout {
   int a;
@@ -1694,22 +1781,29 @@ void is_layout_compatible(int n)
   static_assert(__is_layout_compatible(int, volatile int));
   static_assert(__is_layout_compatible(const int, volatile int));
   static_assert(__is_layout_compatible(int *, int * __restrict));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   // Note: atomic qualification matters for layout compatibility.
+  // Note: OpenCL no _Atomic
   static_assert(!__is_layout_compatible(int, _Atomic int));
   static_assert(__is_layout_compatible(_Atomic(int), _Atomic int));
+#endif
   static_assert(!__is_layout_compatible(int, unsigned int));
   static_assert(!__is_layout_compatible(char, unsigned char));
   static_assert(!__is_layout_compatible(char, signed char));
   static_assert(!__is_layout_compatible(unsigned char, signed char));
   static_assert(__is_layout_compatible(int[], int[]));
   static_assert(__is_layout_compatible(int[2], int[2]));
+  // OpenCLCPP: No VLA
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(!__is_layout_compatible(int[n], int[2]));
   // expected-error@-1 {{variable length arrays are not supported in 
'__is_layout_compatible'}}
   static_assert(!__is_layout_compatible(int[n], int[n]));
   // expected-error@-1 {{variable length arrays are not supported in 
'__is_layout_compatible'}}
   // expected-error@-2 {{variable length arrays are not supported in 
'__is_layout_compatible'}}
+#endif
   static_assert(__is_layout_compatible(int&, int&));
   static_assert(!__is_layout_compatible(int&, char&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_layout_compatible(void(int), void(int)));
   static_assert(!__is_layout_compatible(void(int), void(char)));
   static_assert(__is_layout_compatible(void(&)(int), void(&)(int)));
@@ -1725,7 +1819,9 @@ void is_layout_compatible(int n)
   // expected-warning@-1 {{'const' qualifier on function type 'function_type' 
(aka 'void ()') has no effect}}
   static_assert(!__is_layout_compatible(const function_type, const 
function_type2));
   // expected-warning@-1 {{'const' qualifier on function type 'function_type' 
(aka 'void ()') has no effect}}
-  // expected-warning@-2 {{'const' qualifier on function type 'function_type2' 
(aka 'void (char)') has no effect}}
+  // expected-noncl-warning@-2 {{'const' qualifier on function type 
'function_type2' (aka 'void (char)') has no effect}}
+  // expected-cl-warning@-3 {{'const' qualifier on function type 
'function_type2' (aka 'void (__private char)') has no effect}}
+#endif
   static_assert(__is_layout_compatible(CStruct, CStruct2));
   static_assert(__is_layout_compatible(CStruct, const CStruct2));
   static_assert(__is_layout_compatible(CStruct, volatile CStruct2));
@@ -1734,26 +1830,34 @@ void is_layout_compatible(int n)
   static_assert(__is_layout_compatible(CppEmptyStruct, CppEmptyStruct2));
   static_assert(__is_layout_compatible(CppStructStandard, CppStructStandard2));
   static_assert(!__is_layout_compatible(CppStructNonStandardByBase, 
CppStructNonStandardByBase2));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_layout_compatible(CppStructNonStandardByVirt, 
CppStructNonStandardByVirt2));
   static_assert(!__is_layout_compatible(CppStructNonStandardByMemb, 
CppStructNonStandardByMemb2));
+#endif
   static_assert(!__is_layout_compatible(CppStructNonStandardByProt, 
CppStructNonStandardByProt2));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_layout_compatible(CppStructNonStandardByVirtBase, 
CppStructNonStandardByVirtBase2));
   static_assert(!__is_layout_compatible(CppStructNonStandardBySameBase, 
CppStructNonStandardBySameBase2));
   static_assert(!__is_layout_compatible(CppStructNonStandardBy2ndVirtBase, 
CppStructNonStandardBy2ndVirtBase2));
+#endif
   static_assert(__is_layout_compatible(CStruct, CStructWithQualifiers));
   static_assert(__is_layout_compatible(CStruct, CStructNoUniqueAddress) != 
bool(__has_cpp_attribute(no_unique_address)));
   static_assert(__is_layout_compatible(CStructNoUniqueAddress, 
CStructNoUniqueAddress2) != bool(__has_cpp_attribute(no_unique_address)));
   static_assert(__is_layout_compatible(CStruct, CStructAlignment));
   static_assert(!__is_layout_compatible(CStruct, CStructAlignedMembers));
   static_assert(__is_layout_compatible(UnionNoOveralignedMembers, 
UnionWithOveralignedMembers));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_layout_compatible(CStructWithBitfelds, 
CStructWithBitfelds));
   static_assert(__is_layout_compatible(CStructWithBitfelds, 
CStructWithBitfelds2));
   static_assert(!__is_layout_compatible(CStructWithBitfelds, 
CStructWithBitfelds3));
   static_assert(!__is_layout_compatible(CStructWithBitfelds, 
CStructWithBitfelds4));
+#endif
   static_assert(__is_layout_compatible(int CStruct2::*, int CStruct2::*));
   static_assert(!__is_layout_compatible(int CStruct2::*, char CStruct2::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_layout_compatible(void(CStruct2::*)(int), 
void(CStruct2::*)(int)));
   static_assert(!__is_layout_compatible(void(CStruct2::*)(int), 
void(CStruct2::*)(char)));
+#endif
   static_assert(__is_layout_compatible(CStructNested, CStructNested2));
   static_assert(__is_layout_compatible(UnionLayout, UnionLayout));
   static_assert(!__is_layout_compatible(UnionLayout, UnionLayout2));
@@ -1844,12 +1948,15 @@ void is_pointer_interconvertible_base_of(int n)
   static_assert(!__is_pointer_interconvertible_base_of(int, volatile int));
   static_assert(!__is_pointer_interconvertible_base_of(const int, volatile 
int));
   static_assert(!__is_pointer_interconvertible_base_of(int *, int * 
__restrict));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(!__is_pointer_interconvertible_base_of(int, _Atomic int));
   static_assert(!__is_pointer_interconvertible_base_of(_Atomic(int), _Atomic 
int));
+#endif
   static_assert(!__is_pointer_interconvertible_base_of(int, unsigned int));
   static_assert(!__is_pointer_interconvertible_base_of(char, unsigned char));
   static_assert(!__is_pointer_interconvertible_base_of(char, signed char));
   static_assert(!__is_pointer_interconvertible_base_of(unsigned char, signed 
char));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   using function_type = void();
   using function_type2 = void(char);
   static_assert(!__is_pointer_interconvertible_base_of(const function_type, 
const function_type));
@@ -1859,27 +1966,36 @@ void is_pointer_interconvertible_base_of(int n)
   // expected-warning@-1 {{'const' qualifier on function type 'function_type' 
(aka 'void ()') has no effect}}
   static_assert(!__is_pointer_interconvertible_base_of(const function_type, 
const function_type2));
   // expected-warning@-1 {{'const' qualifier on function type 'function_type' 
(aka 'void ()') has no effect}}
-  // expected-warning@-2 {{'const' qualifier on function type 'function_type2' 
(aka 'void (char)') has no effect}}
+  // expected-noncl-warning@-2 {{'const' qualifier on function type 
'function_type2' (aka 'void (char)') has no effect}}
+  // expected-cl-warning@-3 {{'const' qualifier on function type 
'function_type2' (aka 'void (__private char)') has no effect}}
+#endif
   static_assert(!__is_pointer_interconvertible_base_of(int CStruct2::*, int 
CStruct2::*));
   static_assert(!__is_pointer_interconvertible_base_of(int CStruct2::*, char 
CStruct2::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_pointer_interconvertible_base_of(void(CStruct2::*)(int), 
void(CStruct2::*)(int)));
   static_assert(!__is_pointer_interconvertible_base_of(void(CStruct2::*)(int), 
void(CStruct2::*)(char)));
+#endif
   static_assert(!__is_pointer_interconvertible_base_of(int[], int[]));
   static_assert(!__is_pointer_interconvertible_base_of(int[], double[]));
   static_assert(!__is_pointer_interconvertible_base_of(int[2], int[2]));
+  // OpenCLCPP: No VLA
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(!__is_pointer_interconvertible_base_of(int[n], int[2]));
   // expected-error@-1 {{variable length arrays are not supported in 
'__is_pointer_interconvertible_base_of'}}
   static_assert(!__is_pointer_interconvertible_base_of(int[n], int[n]));
   // expected-error@-1 {{variable length arrays are not supported in 
'__is_pointer_interconvertible_base_of'}}
   // expected-error@-2 {{variable length arrays are not supported in 
'__is_pointer_interconvertible_base_of'}}
+#endif
   static_assert(!__is_pointer_interconvertible_base_of(int&, int&));
   static_assert(!__is_pointer_interconvertible_base_of(int&, char&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_pointer_interconvertible_base_of(void(int), void(int)));
   static_assert(!__is_pointer_interconvertible_base_of(void(int), void(char)));
   static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), 
void(&)(int)));
   static_assert(!__is_pointer_interconvertible_base_of(void(&)(int), 
void(&)(char)));
   static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), 
void(*)(int)));
   static_assert(!__is_pointer_interconvertible_base_of(void(*)(int), 
void(*)(char)));
+#endif
 }
 }
 
@@ -1925,13 +2041,17 @@ struct UserDeletedDestructorInAggregate {
   ~UserDeletedDestructorInAggregate() = delete;
 };
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct UserDeletedDestructorInNonAggregate {
   virtual void NonAggregate();
   ~UserDeletedDestructorInNonAggregate() = delete;
 };
+#endif
 
 struct DeletedDestructorViaBaseInAggregate : UserDeletedDestructorInAggregate 
{};
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct DeletedDestructorViaBaseInNonAggregate : 
UserDeletedDestructorInNonAggregate {};
+#endif
 
 #if __cplusplus >= 202002L
 template<bool B>
@@ -1975,10 +2095,13 @@ void is_implicit_lifetime(int n) {
   static_assert(__builtin_is_implicit_lifetime(int*));
   static_assert(__builtin_is_implicit_lifetime(int[]));
   static_assert(__builtin_is_implicit_lifetime(int[5]));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(__builtin_is_implicit_lifetime(int[n]));
   // expected-error@-1 {{variable length arrays are not supported in 
'__builtin_is_implicit_lifetime'}}
+#endif
   static_assert(__builtin_is_implicit_lifetime(Enum));
   static_assert(__builtin_is_implicit_lifetime(EnumClass));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__builtin_is_implicit_lifetime(void()));
   static_assert(!__builtin_is_implicit_lifetime(void() &));
   static_assert(!__builtin_is_implicit_lifetime(void() const));
@@ -1990,6 +2113,7 @@ void is_implicit_lifetime(int n) {
   static_assert(__builtin_is_implicit_lifetime(int 
(UserDeclaredDestructor::*)() const));
   static_assert(__builtin_is_implicit_lifetime(int 
(UserDeclaredDestructor::*)() &));
   static_assert(__builtin_is_implicit_lifetime(int 
(UserDeclaredDestructor::*)() &&));
+#endif
   static_assert(!__builtin_is_implicit_lifetime(IncompleteStruct));
   // expected-error@-1 {{incomplete type 'IncompleteStruct' used in type trait 
expression}}
   static_assert(__builtin_is_implicit_lifetime(IncompleteStruct[]));
@@ -2005,9 +2129,13 @@ void is_implicit_lifetime(int n) {
   
static_assert(__builtin_is_implicit_lifetime(InheritedOnlyDefaultConstructorIsTrivial));
   
static_assert(__builtin_is_implicit_lifetime(InheritedAllContstructorsAreTrivial));
   
static_assert(__builtin_is_implicit_lifetime(UserDeletedDestructorInAggregate));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   
static_assert(!__builtin_is_implicit_lifetime(UserDeletedDestructorInNonAggregate));
+#endif
   
static_assert(__builtin_is_implicit_lifetime(DeletedDestructorViaBaseInAggregate)
 == __cplusplus >= 201703L);
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   
static_assert(!__builtin_is_implicit_lifetime(DeletedDestructorViaBaseInNonAggregate));
+#endif
 #if __cplusplus >= 202002L
   
static_assert(__builtin_is_implicit_lifetime(ConstrainedUserDeclaredDefaultConstructor<true>));
   
static_assert(!__builtin_is_implicit_lifetime(ConstrainedUserDeclaredDefaultConstructor<false>));
@@ -2015,14 +2143,18 @@ void is_implicit_lifetime(int n) {
   
static_assert(__builtin_is_implicit_lifetime(ConstrainedUserProvidedDestructor<false>));
 #endif
 
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(__builtin_is_implicit_lifetime(__int128));
+#endif
   static_assert(__builtin_is_implicit_lifetime(_BitInt(8)));
   static_assert(__builtin_is_implicit_lifetime(_BitInt(128)));
   static_assert(__builtin_is_implicit_lifetime(int[0]));
   static_assert(__builtin_is_implicit_lifetime(StructWithFAM));
   static_assert(__builtin_is_implicit_lifetime(StructWithZeroSizedArray));
   static_assert(__builtin_is_implicit_lifetime(__fp16));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(__builtin_is_implicit_lifetime(__bf16));
+#endif
   static_assert(__builtin_is_implicit_lifetime(_Complex double));
   static_assert(__builtin_is_implicit_lifetime(float4));
   static_assert(__builtin_is_implicit_lifetime(align_value_int));
@@ -2033,8 +2165,10 @@ void is_implicit_lifetime(int n) {
   static_assert(__builtin_is_implicit_lifetime(int * _Nonnull));
   static_assert(__builtin_is_implicit_lifetime(int * _Null_unspecified));
   static_assert(__builtin_is_implicit_lifetime(int * _Nullable));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(!__builtin_is_implicit_lifetime(_Atomic int));
   // expected-error@-1 {{atomic types are not supported in 
'__builtin_is_implicit_lifetime'}}
+#endif
   static_assert(__builtin_is_implicit_lifetime(int * __restrict));
 }
 
@@ -2110,12 +2244,14 @@ struct HasMove {
   HasMove(HasMove&& cp);
 };
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct HasTemplateCons {
   HasVirt Annoying;
 
   template <typename T>
   HasTemplateCons(const T&);
 };
+#endif
 
 void has_trivial_default_constructor() {
   static_assert(__has_trivial_constructor(Int));
@@ -2141,10 +2277,14 @@ void has_trivial_default_constructor() {
   static_assert(!__has_trivial_constructor(HasRef));
   static_assert(!__has_trivial_constructor(HasCopy));
   static_assert(!__has_trivial_constructor(IntRef));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_trivial_constructor(VirtAr));
+#endif
   static_assert(!__has_trivial_constructor(void));
   static_assert(!__has_trivial_constructor(cvoid));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_trivial_constructor(HasTemplateCons));
+#endif
   static_assert(!__has_trivial_constructor(AllPrivate));
   static_assert(!__has_trivial_constructor(ExtDefaulted));
 }
@@ -2170,8 +2310,10 @@ void has_trivial_move_constructor() {
   static_assert(__has_trivial_move_constructor(ACompleteType[]));
 
   static_assert(!__has_trivial_move_constructor(AnIncompleteType[])); // 
expected-error {{incomplete type}}
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_trivial_move_constructor(HasVirt));
   static_assert(!__has_trivial_move_constructor(DerivesVirt));
+#endif
   static_assert(!__has_trivial_move_constructor(HasMoveCtor));
   static_assert(!__has_trivial_move_constructor(DerivesHasMoveCtor));
   static_assert(!__has_trivial_move_constructor(HasMemberMoveCtor));
@@ -2203,8 +2345,10 @@ void has_trivial_copy_constructor() {
 
   static_assert(!__has_trivial_copy(AnIncompleteType[])); // expected-error 
{{incomplete type}}
   static_assert(!__has_trivial_copy(HasCopy));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_trivial_copy(HasTemplateCons));
   static_assert(!__has_trivial_copy(VirtAr));
+#endif
   static_assert(!__has_trivial_copy(void));
   static_assert(!__has_trivial_copy(cvoid));
   static_assert(!__has_trivial_copy(AllPrivate));
@@ -2237,7 +2381,9 @@ void has_trivial_copy_assignment() {
   static_assert(!__has_trivial_assign(const Int));
   static_assert(!__has_trivial_assign(ConstIntAr));
   static_assert(!__has_trivial_assign(ConstIntArAr));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_trivial_assign(VirtAr));
+#endif
   static_assert(!__has_trivial_assign(void));
   static_assert(!__has_trivial_assign(cvoid));
   static_assert(!__has_trivial_assign(AllPrivate));
@@ -2263,7 +2409,9 @@ void has_trivial_destructor() {
   static_assert(__has_trivial_destructor(HasMoveAssign));
   static_assert(__has_trivial_destructor(const Int));
   static_assert(__has_trivial_destructor(DerivesAr));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__has_trivial_destructor(VirtAr));
+#endif
   static_assert(__has_trivial_destructor(AllDefaulted));
   static_assert(__has_trivial_destructor(AllDeleted));
   static_assert(__has_trivial_destructor(DerivesHasRef));
@@ -2331,7 +2479,9 @@ void has_nothrow_assign() {
   static_assert(!__has_nothrow_assign(const Int));
   static_assert(!__has_nothrow_assign(ConstIntAr));
   static_assert(!__has_nothrow_assign(ConstIntArAr));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_nothrow_assign(VirtAr));
+#endif
   static_assert(!__has_nothrow_assign(void));
   static_assert(!__has_nothrow_assign(cvoid));
   static_assert(!__has_nothrow_assign(PR11110));
@@ -2386,8 +2536,10 @@ void has_trivial_move_assign() {
   static_assert(__has_trivial_move_assign(ACompleteType[]));
 
   static_assert(!__has_trivial_move_assign(AnIncompleteType[])); // 
expected-error {{incomplete type}}
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_trivial_move_assign(HasVirt));
   static_assert(!__has_trivial_move_assign(DerivesVirt));
+#endif
   static_assert(!__has_trivial_move_assign(HasMoveAssign));
   static_assert(!__has_trivial_move_assign(DerivesHasMoveAssign));
   static_assert(!__has_trivial_move_assign(HasMemberMoveAssign));
@@ -2415,8 +2567,10 @@ void has_nothrow_copy() {
   static_assert(__has_nothrow_copy(HasMoveAssign));
   static_assert(__has_nothrow_copy(HasNoThrowCopy));
   static_assert(__has_nothrow_copy(HasMultipleNoThrowCopy));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__has_nothrow_copy(HasVirtDest));
   static_assert(__has_nothrow_copy(HasTemplateCons));
+#endif
   static_assert(__has_nothrow_copy(AllPrivate));
   static_assert(__has_nothrow_copy(DerivesAr));
   static_assert(__has_nothrow_copy(ACompleteType[]));
@@ -2424,7 +2578,9 @@ void has_nothrow_copy() {
   static_assert(!__has_nothrow_copy(AnIncompleteType[])); // expected-error 
{{incomplete type}}
   static_assert(!__has_nothrow_copy(HasCopy));
   static_assert(!__has_nothrow_copy(HasMultipleCopy));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_nothrow_copy(VirtAr));
+#endif
   static_assert(!__has_nothrow_copy(void));
   static_assert(!__has_nothrow_copy(cvoid));
 }
@@ -2458,7 +2614,9 @@ void has_nothrow_constructor() {
   static_assert(!__has_nothrow_constructor(IntRef));
   static_assert(!__has_nothrow_constructor(void));
   static_assert(!__has_nothrow_constructor(cvoid));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_nothrow_constructor(HasTemplateCons));
+#endif
 
   static_assert(!__has_nothrow_constructor(HasMultipleDefaultConstructor1));
   static_assert(!__has_nothrow_constructor(HasMultipleDefaultConstructor2));
@@ -2484,13 +2642,17 @@ void has_virtual_destructor() {
   static_assert(!__has_virtual_destructor(HasCopyAssign));
   static_assert(!__has_virtual_destructor(HasMoveAssign));
   static_assert(!__has_virtual_destructor(IntRef));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__has_virtual_destructor(VirtAr));
+#endif
   static_assert(!__has_virtual_destructor(ACompleteType[]));
 
   static_assert(!__has_virtual_destructor(AnIncompleteType[])); // 
expected-error {{incomplete type}}
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__has_virtual_destructor(HasVirtDest));
   static_assert(__has_virtual_destructor(DerivedVirtDest));
   static_assert(!__has_virtual_destructor(VirtDestAr));
+#endif
   static_assert(!__has_virtual_destructor(void));
   static_assert(!__has_virtual_destructor(cvoid));
   static_assert(!__has_virtual_destructor(AllPrivate));
@@ -2594,7 +2756,9 @@ void is_virtual_base_of(int n) {
   static_assert(!__builtin_is_virtual_base_of(class_forward, Empty));
   static_assert(!__builtin_is_virtual_base_of(Base&, Derived&));
   static_assert(!__builtin_is_virtual_base_of(Base[10], Derived[10]));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(!__builtin_is_virtual_base_of(Base[n], Derived[n])); // 
expected-error 2 {{variable length arrays are not supported in 
'__builtin_is_virtual_base_of'}}
+#endif
   static_assert(!__builtin_is_virtual_base_of(int, int));
   static_assert(!__builtin_is_virtual_base_of(int[], int[]));
   static_assert(!__builtin_is_virtual_base_of(long, int));
@@ -2629,7 +2793,9 @@ void is_virtual_base_of(int n) {
   static_assert(!__builtin_is_virtual_base_of(Union, Empty));
   static_assert(!__builtin_is_virtual_base_of(int, Empty));
   static_assert(!__builtin_is_virtual_base_of(Union, int));
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   static_assert(!__builtin_is_virtual_base_of(IncompleteStruct, 
IncompleteStruct[n])); // expected-error {{variable length arrays are not 
supported in '__builtin_is_virtual_base_of'}}
+#endif
 }
 
 template<class T, class U>
@@ -2752,7 +2918,9 @@ struct X0 {
   template<typename U> X0(const X0<U>&);
 };
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct Abstract { virtual void f() = 0; };
+#endif
 
 void is_convertible_to() {
   static_assert(__is_convertible_to(Int, Int));
@@ -2778,7 +2946,9 @@ void is_convertible_to() {
   static_assert(!__is_convertible_to(Function, Function));
   static_assert(!__is_convertible_to(PrivateCopy, PrivateCopy));
   static_assert(__is_convertible_to(X0<int>, X0<float>));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_convertible_to(Abstract, Abstract));
+#endif
 }
 
 namespace is_convertible_to_instantiate {
@@ -2821,13 +2991,17 @@ void is_trivial()
   static_assert(!__is_trivial(HasDest));
   static_assert(!__is_trivial(HasRef));
   static_assert(!__is_trivial(HasNonPOD));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_trivial(HasVirt));
+#endif
   static_assert(!__is_trivial(DerivesHasCons));
   static_assert(!__is_trivial(DerivesHasCopyAssign));
   static_assert(!__is_trivial(DerivesHasMoveAssign));
   static_assert(!__is_trivial(DerivesHasDest));
   static_assert(!__is_trivial(DerivesHasRef));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_trivial(DerivesHasVirt));
+#endif
   static_assert(!__is_trivial(void));
   static_assert(!__is_trivial(cvoid));
 }
@@ -2876,11 +3050,15 @@ void trivial_checks()
   static_assert(!__is_trivially_copyable(HasCopyAssign));
   static_assert(!__is_trivially_copyable(HasMoveAssign));
   static_assert(!__is_trivially_copyable(HasDest));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_trivially_copyable(HasVirt));
+#endif
   static_assert(!__is_trivially_copyable(DerivesHasCopyAssign));
   static_assert(!__is_trivially_copyable(DerivesHasMoveAssign));
   static_assert(!__is_trivially_copyable(DerivesHasDest));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__is_trivially_copyable(DerivesHasVirt));
+#endif
   static_assert(!__is_trivially_copyable(void));
   static_assert(!__is_trivially_copyable(cvoid));
 
@@ -3035,9 +3213,11 @@ void constructible_checks() {
   static_assert(__is_constructible(NonPOD, int));
   static_assert(!__is_nothrow_constructible(NonPOD, int));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   // PR19178
   static_assert(!__is_constructible(Abstract));
   static_assert(!__is_nothrow_constructible(Abstract));
+#endif
 
   // PR20228
   static_assert(__is_constructible(VariadicCtor,
@@ -3086,7 +3266,9 @@ void is_trivially_constructible_test() {
   static_assert(!(is_trivially_constructible<int, int*>::value));
   static_assert(!(is_trivially_constructible<NonTrivialDefault>::value));
   static_assert(!(is_trivially_constructible<ThreeArgCtor, int*, char*, 
int&>::value));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!(is_trivially_constructible<Abstract>::value)); // PR19178
+#endif
 
   static_assert(__is_trivially_constructible(ACompleteType));
   static_assert(!__is_trivially_constructible(AnIncompleteType)); // 
expected-error {{incomplete type}}
@@ -3145,8 +3327,10 @@ void reference_binds_to_temporary_checks() {
   static_assert((__reference_binds_to_temporary(const int &, long)));
 
   // Test that function references are never considered bound to temporaries.
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__reference_binds_to_temporary(void(&)(), void()));
   static_assert(!__reference_binds_to_temporary(void(&&)(), void()));
+#endif
 }
 
 
@@ -3206,8 +3390,10 @@ void reference_constructs_from_temporary_checks() {
   static_assert(__reference_constructs_from_temporary(const int &, long));
 
   // Test that function references are never considered bound to temporaries.
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(!__reference_constructs_from_temporary(void(&&)(), void()));
   static_assert(!__reference_constructs_from_temporary(void(&)(), void()));
+#endif
 
   // LWG3819: reference_meows_from_temporary should not use is_meowible
   
static_assert(__reference_constructs_from_temporary(ConvertsFromNonMovable&&, 
NonMovable) == __cplusplus >= 201703L);
@@ -3272,9 +3458,11 @@ void reference_converts_from_temporary_checks() {
 
   static_assert(__reference_converts_from_temporary(const int &, long));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   // Test that function references are never considered bound to temporaries.
   static_assert(!__reference_converts_from_temporary(void(&)(), void()));
   static_assert(!__reference_converts_from_temporary(void(&&)(), void()));
+#endif
 
   // LWG3819: reference_meows_from_temporary should not use is_meowible
   static_assert(__reference_converts_from_temporary(ConvertsFromNonMovable&&, 
NonMovable) == __cplusplus >= 201703L);
@@ -3399,19 +3587,25 @@ 
static_assert(__has_unique_object_representations(volatile int *), "as are point
 static_assert(__has_unique_object_representations(const volatile int *), "as 
are pointers");
 
 class C {};
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 using FP = int (*)(int);
 using PMF = int (C::*)(int);
+#endif
 using PMD = int C::*;
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 static_assert(__has_unique_object_representations(FP), "even function 
pointers");
 static_assert(__has_unique_object_representations(const FP), "even function 
pointers");
 static_assert(__has_unique_object_representations(volatile FP), "even function 
pointers");
 static_assert(__has_unique_object_representations(const volatile FP), "even 
function pointers");
+#endif
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 static_assert(__has_unique_object_representations(PMF), "and pointer to 
members");
 static_assert(__has_unique_object_representations(const PMF), "and pointer to 
members");
 static_assert(__has_unique_object_representations(volatile PMF), "and pointer 
to members");
 static_assert(__has_unique_object_representations(const volatile PMF), "and 
pointer to members");
+#endif
 
 static_assert(__has_unique_object_representations(PMD), "and pointer to 
members");
 static_assert(__has_unique_object_representations(const PMD), "and pointer to 
members");
@@ -3428,8 +3622,10 @@ static_assert(__has_unique_object_representations(int), 
"yes, all integral types
 static_assert(__has_unique_object_representations(unsigned int), "yes, all 
integral types");
 static_assert(__has_unique_object_representations(long), "yes, all integral 
types");
 static_assert(__has_unique_object_representations(unsigned long), "yes, all 
integral types");
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 static_assert(__has_unique_object_representations(long long), "yes, all 
integral types");
 static_assert(__has_unique_object_representations(unsigned long long), "yes, 
all integral types");
+#endif
 static_assert(__has_unique_object_representations(wchar_t), "yes, all integral 
types");
 static_assert(__has_unique_object_representations(char16_t), "yes, all 
integral types");
 static_assert(__has_unique_object_representations(char32_t), "yes, all 
integral types");
@@ -3565,6 +3761,7 @@ class EmptyInheritor : Compressed {};
 
 static_assert(__has_unique_object_representations(EmptyInheritor), "As long as 
the base has items, empty is ok");
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 class Dynamic {
   virtual void A();
   int i;
@@ -3577,6 +3774,7 @@ class InheritsDynamic : Dynamic {
 };
 
 static_assert(!__has_unique_object_representations(InheritsDynamic), "Dynamic 
types are not valid");
+#endif
 
 static_assert(__has_unique_object_representations(int[42]), "Arrays are fine, 
as long as their value type is");
 static_assert(__has_unique_object_representations(int[]), "Arrays are fine, as 
long as their value type is");
@@ -3619,6 +3817,7 @@ 
static_assert(!__has_unique_object_representations(int(int) const &&), "Function
 static_assert(!__has_unique_object_representations(int(int) volatile &&), 
"Functions are not unique");
 static_assert(!__has_unique_object_representations(int(int) const volatile 
&&), "Functions are not unique");
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 static_assert(!__has_unique_object_representations(int(int, ...)), "Functions 
are not unique");
 static_assert(!__has_unique_object_representations(int(int, ...) const), 
"Functions are not unique");
 static_assert(!__has_unique_object_representations(int(int, ...) volatile), 
"Functions are not unique");
@@ -3631,6 +3830,7 @@ 
static_assert(!__has_unique_object_representations(int(int, ...) &&), "Functions
 static_assert(!__has_unique_object_representations(int(int, ...) const &&), 
"Functions are not unique");
 static_assert(!__has_unique_object_representations(int(int, ...) volatile &&), 
"Functions are not unique");
 static_assert(!__has_unique_object_representations(int(int, ...) const 
volatile &&), "Functions are not unique");
+#endif
 
 void foo(){
   static auto lambda = []() {};
@@ -3640,6 +3840,7 @@ void foo(){
   static_assert(__has_unique_object_representations(decltype(lambda2)), 
"Lambdas follow struct rules");
 }
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct PaddedBitfield {
   char c : 6;
   char d : 1;
@@ -3705,6 +3906,7 @@ struct GreaterSizeBitfield {
 
 static_assert(sizeof(GreaterSizeBitfield) == 128, "Bitfield Size");
 static_assert(!__has_unique_object_representations(GreaterSizeBitfield), 
"Bitfield padding");
+#endif
 
 struct StructWithRef {
   int &I;
@@ -4051,6 +4253,7 @@ struct 
NotTriviallyEqualityComparableTriviallyEqualityComparableBases
 };
 
static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableTriviallyEqualityComparableBases));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct NotTriviallyEqualityComparableBitfield {
   int i : 1;
 
@@ -4065,6 +4268,7 @@ struct NotTriviallyEqualityComparableBitfieldFilled {
   bool operator==(const NotTriviallyEqualityComparableBitfieldFilled&) const = 
default;
 };
 
static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield));
+#endif
 
 union U {
   int i;
@@ -4304,6 +4508,7 @@ struct 
NotTriviallyEqualityComparableTriviallyEqualityComparableBases
 };
 
static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableTriviallyEqualityComparableBases));
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 struct NotTriviallyEqualityComparableBitfield {
   int i : 1;
 
@@ -4318,6 +4523,7 @@ struct NotTriviallyEqualityComparableBitfieldFilled {
   friend bool operator==(const NotTriviallyEqualityComparableBitfieldFilled&, 
const NotTriviallyEqualityComparableBitfieldFilled&) = default;
 };
 
static_assert(!__is_trivially_equality_comparable(NotTriviallyEqualityComparableBitfield));
+#endif
 
 union U {
   int i;
@@ -4433,9 +4639,11 @@ void check_remove_const() {
   static_assert(__is_same(remove_const_t<int const &>, int const &));
   static_assert(__is_same(remove_const_t<int &&>, int &&));
   static_assert(__is_same(remove_const_t<int const &&>, int const &&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_const_t<int()>, int()));
   static_assert(__is_same(remove_const_t<int (*const)()>, int (*)()));
   static_assert(__is_same(remove_const_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(remove_const_t<S>, S));
   static_assert(__is_same(remove_const_t<const S>, S));
@@ -4444,7 +4652,9 @@ void check_remove_const() {
   static_assert(__is_same(remove_const_t<const volatile S>, volatile S));
   static_assert(__is_same(remove_const_t<S *const volatile __restrict>, S 
*volatile __restrict));
   static_assert(__is_same(remove_const_t<int S::*const>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_const_t<int (S::*const)()>, int(S::*)()));
+#endif
 }
 
 template <class T> using remove_restrict_t = __remove_restrict(T);
@@ -4462,9 +4672,11 @@ void check_remove_restrict() {
   static_assert(__is_same(remove_restrict_t<int &__restrict>, int &));
   static_assert(__is_same(remove_restrict_t<int &&>, int &&));
   static_assert(__is_same(remove_restrict_t<int &&__restrict>, int &&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_restrict_t<int()>, int()));
   static_assert(__is_same(remove_restrict_t<int (*const volatile)()>, int 
(*const volatile)()));
   static_assert(__is_same(remove_restrict_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(remove_restrict_t<S>, S));
   static_assert(__is_same(remove_restrict_t<const S>, const S));
@@ -4472,7 +4684,9 @@ void check_remove_restrict() {
   static_assert(__is_same(remove_restrict_t<S *__restrict>, S *));
   static_assert(__is_same(remove_restrict_t<S *const volatile __restrict>, S 
*const volatile));
   static_assert(__is_same(remove_restrict_t<int S::*__restrict>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_restrict_t<int (S::*const volatile)()>, 
int(S::*const volatile)()));
+#endif
 }
 
 template <class T> using remove_volatile_t = __remove_volatile(T);
@@ -4493,16 +4707,20 @@ void check_remove_volatile() {
   static_assert(__is_same(remove_volatile_t<int volatile &>, int volatile &));
   static_assert(__is_same(remove_volatile_t<int &&>, int &&));
   static_assert(__is_same(remove_volatile_t<int volatile &&>, int volatile 
&&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_volatile_t<int()>, int()));
   static_assert(__is_same(remove_volatile_t<int (*volatile)()>, int (*)()));
   static_assert(__is_same(remove_volatile_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(remove_volatile_t<S>, S));
   static_assert(__is_same(remove_volatile_t<const S>, const S));
   static_assert(__is_same(remove_volatile_t<volatile S>, S));
   static_assert(__is_same(remove_volatile_t<const volatile S>, const S));
   static_assert(__is_same(remove_volatile_t<int S::*volatile>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_volatile_t<int (S::*volatile)()>, 
int(S::*)()));
+#endif
 }
 
 template <class T> using remove_cv_t = __remove_cv(T);
@@ -4523,16 +4741,20 @@ void check_remove_cv() {
   static_assert(__is_same(remove_cv_t<int const volatile &>, int const 
volatile &));
   static_assert(__is_same(remove_cv_t<int &&>, int &&));
   static_assert(__is_same(remove_cv_t<int const volatile &&>, int const 
volatile &&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_cv_t<int()>, int()));
   static_assert(__is_same(remove_cv_t<int (*const volatile)()>, int (*)()));
   static_assert(__is_same(remove_cv_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(remove_cv_t<S>, S));
   static_assert(__is_same(remove_cv_t<const S>, S));
   static_assert(__is_same(remove_cv_t<volatile S>, S));
   static_assert(__is_same(remove_cv_t<const volatile S>, S));
   static_assert(__is_same(remove_cv_t<int S::*const volatile>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_cv_t<int (S::*const volatile)()>, 
int(S::*)()));
+#endif
 }
 
 template <class T> using add_pointer_t = __add_pointer(T);
@@ -4549,16 +4771,20 @@ void add_pointer() {
   static_assert(__is_same(add_pointer_t<int *>, int **));
   static_assert(__is_same(add_pointer_t<int &>, int *));
   static_assert(__is_same(add_pointer_t<int &&>, int *));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(add_pointer_t<int()>, int (*)()));
   static_assert(__is_same(add_pointer_t<int (*)()>, int (**)()));
   static_assert(__is_same(add_pointer_t<int (&)()>, int (*)()));
+#endif
 
   static_assert(__is_same(add_pointer_t<S>, S *));
   static_assert(__is_same(add_pointer_t<const S>, const S *));
   static_assert(__is_same(add_pointer_t<volatile S>, volatile S *));
   static_assert(__is_same(add_pointer_t<const volatile S>, const volatile S 
*));
   static_assert(__is_same(add_pointer_t<int S::*>, int S::**));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(add_pointer_t<int (S::*)()>, int(S::**)()));
+#endif
 
   static_assert(__is_same(add_pointer_t<int 
__attribute__((address_space(1)))>, int __attribute__((address_space(1))) *));
   static_assert(__is_same(add_pointer_t<S __attribute__((address_space(2)))>, 
S __attribute__((address_space(2))) *));
@@ -4566,7 +4792,7 @@ void add_pointer() {
 
 template <class T> using remove_pointer_t = __remove_pointer(T);
 
-void remove_pointer() {
+void remove_pointer_common() {
   static_assert(__is_same(remove_pointer_t<void>, void));
   static_assert(__is_same(remove_pointer_t<const void>, const void));
   static_assert(__is_same(remove_pointer_t<volatile void>, volatile void));
@@ -4575,6 +4801,21 @@ void remove_pointer() {
   static_assert(__is_same(remove_pointer_t<const int>, const int));
   static_assert(__is_same(remove_pointer_t<volatile int>, volatile int));
   static_assert(__is_same(remove_pointer_t<const volatile int>, const volatile 
int));
+
+  static_assert(__is_same(remove_pointer_t<S>, S));
+  static_assert(__is_same(remove_pointer_t<const S>, const S));
+  static_assert(__is_same(remove_pointer_t<volatile S>, volatile S));
+  static_assert(__is_same(remove_pointer_t<const volatile S>, const volatile 
S));
+  static_assert(__is_same(remove_pointer_t<int S::*>, int S::*));
+
+  static_assert(__is_same(remove_pointer_t<int 
__attribute__((address_space(1))) *>, int __attribute__((address_space(1)))));
+  static_assert(__is_same(remove_pointer_t<S __attribute__((address_space(2))) 
*>, S  __attribute__((address_space(2)))));
+
+}
+
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
+
+void remove_pointer_cpp() {
   static_assert(__is_same(remove_pointer_t<int *>, int));
   static_assert(__is_same(remove_pointer_t<const int *>, const int));
   static_assert(__is_same(remove_pointer_t<volatile int *>, volatile int));
@@ -4584,22 +4825,36 @@ void remove_pointer() {
   static_assert(__is_same(remove_pointer_t<int *const volatile>, int));
   static_assert(__is_same(remove_pointer_t<int &>, int &));
   static_assert(__is_same(remove_pointer_t<int &&>, int &&));
+}
+
+#else
+
+void remove_pointer_clcpp() {
+  static_assert(__is_same(remove_pointer_t<int *>, __generic int));
+  static_assert(__is_same(remove_pointer_t<const int *>, __generic const int));
+  static_assert(__is_same(remove_pointer_t<volatile int *>, __generic volatile 
int));
+  static_assert(__is_same(remove_pointer_t<const volatile int *>, __generic 
const volatile int));
+  static_assert(__is_same(remove_pointer_t<int *const>, __generic int));
+  static_assert(__is_same(remove_pointer_t<int *volatile>, __generic int));
+  static_assert(__is_same(remove_pointer_t<int *const volatile>, __generic 
int));
+  static_assert(__is_same(remove_pointer_t<int &>, __generic int &));
+  static_assert(__is_same(remove_pointer_t<int &&>, __generic int &&));
+
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_pointer_t<int()>, int()));
-  static_assert(__is_same(remove_pointer_t<int (*)()>, int()));
+  // It is impossible to specify such type
+  static_assert(__is_same(remove_pointer_t<int (*)()>, int ()));
   static_assert(__is_same(remove_pointer_t<int (&)()>, int (&)()));
-
-  static_assert(__is_same(remove_pointer_t<S>, S));
-  static_assert(__is_same(remove_pointer_t<const S>, const S));
-  static_assert(__is_same(remove_pointer_t<volatile S>, volatile S));
-  static_assert(__is_same(remove_pointer_t<const volatile S>, const volatile 
S));
-  static_assert(__is_same(remove_pointer_t<int S::*>, int S::*));
+#endif
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_pointer_t<int (S::*)()>, int(S::*)()));
+#endif
 
-  static_assert(__is_same(remove_pointer_t<int 
__attribute__((address_space(1))) *>, int __attribute__((address_space(1)))));
-  static_assert(__is_same(remove_pointer_t<S __attribute__((address_space(2))) 
*>, S  __attribute__((address_space(2)))));
-
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_pointer_t<int (^)(char)>, int (^)(char)));
+#endif
 }
+#endif
 
 template <class T> using add_lvalue_reference_t = __add_lvalue_reference(T);
 
@@ -4615,16 +4870,20 @@ void add_lvalue_reference() {
   static_assert(__is_same(add_lvalue_reference_t<int *>, int *&));
   static_assert(__is_same(add_lvalue_reference_t<int &>, int &));
   static_assert(__is_same(add_lvalue_reference_t<int &&>, int &)); // 
reference collapsing
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(add_lvalue_reference_t<int()>, int (&)()));
   static_assert(__is_same(add_lvalue_reference_t<int (*)()>, int (*&)()));
   static_assert(__is_same(add_lvalue_reference_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(add_lvalue_reference_t<S>, S &));
   static_assert(__is_same(add_lvalue_reference_t<const S>, const S &));
   static_assert(__is_same(add_lvalue_reference_t<volatile S>, volatile S &));
   static_assert(__is_same(add_lvalue_reference_t<const volatile S>, const 
volatile S &));
   static_assert(__is_same(add_lvalue_reference_t<int S::*>, int S::*&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(add_lvalue_reference_t<int (S::*)()>, int(S::*&)()));
+#endif
 }
 
 template <class T> using add_rvalue_reference_t = __add_rvalue_reference(T);
@@ -4641,27 +4900,35 @@ void add_rvalue_reference() {
   static_assert(__is_same(add_rvalue_reference_t<int *>, int *&&));
   static_assert(__is_same(add_rvalue_reference_t<int &>, int &)); // reference 
collapsing
   static_assert(__is_same(add_rvalue_reference_t<int &&>, int &&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(add_rvalue_reference_t<int()>, int(&&)()));
   static_assert(__is_same(add_rvalue_reference_t<int (*)()>, int (*&&)()));
   static_assert(__is_same(add_rvalue_reference_t<int (&)()>, int (&)())); // 
reference collapsing
+#endif
 
   static_assert(__is_same(add_rvalue_reference_t<S>, S &&));
   static_assert(__is_same(add_rvalue_reference_t<const S>, const S &&));
   static_assert(__is_same(add_rvalue_reference_t<volatile S>, volatile S &&));
   static_assert(__is_same(add_rvalue_reference_t<const volatile S>, const 
volatile S &&));
   static_assert(__is_same(add_rvalue_reference_t<int S::*>, int S::*&&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(add_rvalue_reference_t<int (S::*)()>, int(S::* 
&&)()));
+#endif
 }
 
 template <class T> using remove_reference_t = __remove_reference_t(T);
 
-void check_remove_reference() {
+void check_remove_reference_common() {
   static_assert(__is_same(remove_reference_t<void>, void));
   static_assert(__is_same(remove_reference_t<const volatile void>, const 
volatile void));
   static_assert(__is_same(remove_reference_t<int>, int));
   static_assert(__is_same(remove_reference_t<const int>, const int));
   static_assert(__is_same(remove_reference_t<volatile int>, volatile int));
-  static_assert(__is_same(remove_reference_t<const volatile int>, const 
volatile int));
+}
+
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
+
+void check_remove_reference_cpp() {
   static_assert(__is_same(remove_reference_t<int *>, int *));
   static_assert(__is_same(remove_reference_t<int *const volatile>, int *const 
volatile));
   static_assert(__is_same(remove_reference_t<int const *const volatile>, int 
const *const volatile));
@@ -4690,15 +4957,57 @@ void check_remove_reference() {
   static_assert(__is_same(remove_reference_t<int (S::*const volatile &&)() &>, 
int(S::*const volatile)() &));
 }
 
+#else
+
+void check_remove_reference_clcpp() {
+  static_assert(__is_same(remove_reference_t<int *>, __generic int *));
+  static_assert(__is_same(remove_reference_t<int *const volatile>, __generic 
int *const volatile));
+  static_assert(__is_same(remove_reference_t<int const *const volatile>, 
__generic int const *const volatile));
+  static_assert(__is_same(remove_reference_t<int &>, __generic int));
+  static_assert(__is_same(remove_reference_t<int const volatile &>, __generic 
int const volatile));
+  static_assert(__is_same(remove_reference_t<int &&>, __generic int));
+  static_assert(__is_same(remove_reference_t<int const volatile &&>, __generic 
int const volatile));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  static_assert(__is_same(remove_reference_t<int()>, int()));
+  static_assert(__is_same(remove_reference_t<int (*const volatile)()>, int 
(*const volatile)()));
+  static_assert(__is_same(remove_reference_t<int (&)()>, int ()));
+#endif
+
+  static_assert(__is_same(remove_reference_t<S>, S));
+  static_assert(__is_same(remove_reference_t<S &>, __generic S));
+  static_assert(__is_same(remove_reference_t<S &&>, __generic S));
+  static_assert(__is_same(remove_reference_t<const S>, const S));
+  static_assert(__is_same(remove_reference_t<const S &>, __generic const S));
+  static_assert(__is_same(remove_reference_t<const S &&>, __generic const S));
+  static_assert(__is_same(remove_reference_t<volatile S>, volatile S));
+  static_assert(__is_same(remove_reference_t<volatile S &>, __generic volatile 
S));
+  static_assert(__is_same(remove_reference_t<volatile S &&>, __generic 
volatile S));
+  static_assert(__is_same(remove_reference_t<const volatile S>, const volatile 
S));
+  static_assert(__is_same(remove_reference_t<const volatile S &>, __generic 
const volatile S));
+  static_assert(__is_same(remove_reference_t<const volatile S &&>, __generic 
const volatile S));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  static_assert(__is_same(remove_reference_t<int S::*const volatile &>, int 
S::*__generic const volatile));
+  static_assert(__is_same(remove_reference_t<int (S::*const volatile &)()>, 
int(S::*__generic const volatile)()));
+  static_assert(__is_same(remove_reference_t<int (S::*const volatile &&)() &>, 
int(S::*__generic const volatile)() &));
+#endif
+}
+
+#endif
+
 template <class T> using remove_cvref_t = __remove_cvref(T);
 
-void check_remove_cvref() {
+void check_remove_cvref_common() {
   static_assert(__is_same(remove_cvref_t<void>, void));
   static_assert(__is_same(remove_cvref_t<const volatile void>, void));
   static_assert(__is_same(remove_cvref_t<int>, int));
   static_assert(__is_same(remove_cvref_t<const int>, int));
   static_assert(__is_same(remove_cvref_t<volatile int>, int));
   static_assert(__is_same(remove_cvref_t<const volatile int>, int));
+}
+
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
+
+void check_remove_cvref_cpp() {
   static_assert(__is_same(remove_cvref_t<int *>, int *));
   static_assert(__is_same(remove_cvref_t<int *const volatile>, int *));
   static_assert(__is_same(remove_cvref_t<int const *const volatile>, int const 
*));
@@ -4729,16 +5038,59 @@ void check_remove_cvref() {
   static_assert(__is_same(remove_cvref_t<int (S::*const volatile)() &>, 
int(S::*)() &));
   static_assert(__is_same(remove_cvref_t<int (S::*const volatile)() &&>, 
int(S::*)() &&));
 }
+#else
+void check_remove_cvref_clcpp() {
+  static_assert(__is_same(remove_cvref_t<int *>, __generic int *));
+  static_assert(__is_same(remove_cvref_t<int *const volatile>, __generic int 
*));
+  static_assert(__is_same(remove_cvref_t<int const *const volatile>, __generic 
int const *));
+  static_assert(__is_same(remove_cvref_t<int const *const volatile 
__restrict>, __generic int const *__restrict));
+  static_assert(__is_same(remove_cvref_t<int const *const volatile _Nonnull>, 
__generic int const *_Nonnull));
+  static_assert(__is_same(remove_cvref_t<int &>, __generic int));
+  static_assert(__is_same(remove_cvref_t<int const volatile &>, __generic 
int));
+  static_assert(__is_same(remove_cvref_t<int &&>, __generic int));
+  static_assert(__is_same(remove_cvref_t<int const volatile &&>, __generic 
int));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  static_assert(__is_same(remove_cvref_t<int()>, int()));
+  static_assert(__is_same(remove_cvref_t<int (*const volatile)()>, int (*)()));
+  static_assert(__is_same(remove_cvref_t<int (&)()>, int ()));
+#endif
+
+  static_assert(__is_same(remove_cvref_t<S>, S));
+  static_assert(__is_same(remove_cvref_t<S &>, __generic S));
+  static_assert(__is_same(remove_cvref_t<S &&>, __generic S));
+  static_assert(__is_same(remove_cvref_t<const S>, S));
+  static_assert(__is_same(remove_cvref_t<const S &>, __generic S));
+  static_assert(__is_same(remove_cvref_t<const S &&>, __generic S));
+  static_assert(__is_same(remove_cvref_t<volatile S>, S));
+  static_assert(__is_same(remove_cvref_t<volatile S &>, __generic S));
+  static_assert(__is_same(remove_cvref_t<volatile S &&>, __generic S));
+  static_assert(__is_same(remove_cvref_t<const volatile S>, S));
+  static_assert(__is_same(remove_cvref_t<const volatile S &>, __generic S));
+  static_assert(__is_same(remove_cvref_t<const volatile S &&>, __generic S));
+  static_assert(__is_same(remove_cvref_t<int S::*const volatile>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  // TODO: Behaviour of those is most likely incorrect
+  static_assert(__is_same(remove_cvref_t<int (S::*const volatile)()>, 
int(S::*)()));
+  static_assert(__is_same(remove_cvref_t<int (S::*const volatile)() &>, 
int(S::*)() &));
+  static_assert(__is_same(remove_cvref_t<int (S::*const volatile)() &&>, 
int(S::*)() &&));
+#endif
+}
+#endif
 
 template <class T> using decay_t = __decay(T);
 
-void check_decay() {
+void check_decay_common() {
   static_assert(__is_same(decay_t<void>, void));
   static_assert(__is_same(decay_t<const volatile void>, void));
   static_assert(__is_same(decay_t<int>, int));
   static_assert(__is_same(decay_t<const int>, int));
   static_assert(__is_same(decay_t<volatile int>, int));
   static_assert(__is_same(decay_t<const volatile int>, int));
+}
+
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
+
+void check_decay_cpp() {
   static_assert(__is_same(decay_t<int *>, int *));
   static_assert(__is_same(decay_t<int *const volatile>, int *));
   static_assert(__is_same(decay_t<int *const volatile __restrict>, int *));
@@ -4775,6 +5127,55 @@ void check_decay() {
   static_assert(__is_same(decay_t<int (S::*const volatile &)()>, int(S::*)()));
   static_assert(__is_same(decay_t<int S::*const volatile &&>, int S::*));
 }
+#else
+
+typedef __generic int GenInt;
+typedef GenInt GenIntAr[10];
+typedef GenInt GenIntArNB[];
+
+void check_decay_clcpp() {
+  static_assert(__is_same(decay_t<__generic int *>, int *));
+  static_assert(__is_same(decay_t<int *const volatile>, int *));
+  static_assert(__is_same(decay_t<int *const volatile __restrict>, int *));
+  static_assert(__is_same(decay_t<int const *const volatile>, int const *));
+  static_assert(__is_same(decay_t<int const *const volatile _Nonnull>, int 
const *));
+  static_assert(__is_same(decay_t<int &>, __generic int));
+  static_assert(__is_same(decay_t<int const volatile &>, __generic int));
+  static_assert(__is_same(decay_t<int &&>, __generic int));
+  static_assert(__is_same(decay_t<int const volatile &&>, __generic int));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  static_assert(__is_same(decay_t<int()>, int (*)()));
+  static_assert(__is_same(decay_t<int (*)()>, int (*)()));
+  static_assert(__is_same(decay_t<int (*const)()>, int (*)()));
+  static_assert(__is_same(decay_t<int (*volatile)()>, int (*)()));
+  static_assert(__is_same(decay_t<int (*const volatile)()>, int (*)()));
+  static_assert(__is_same(decay_t<int (&)()>, int (*)()));
+#endif
+  static_assert(__is_same(decay_t<GenIntAr>, int *));
+  static_assert(__is_same(decay_t<GenIntArNB>, int *));
+
+  static_assert(__is_same(decay_t<S &>, __generic S));
+  static_assert(__is_same(decay_t<S &&>, __generic S));
+  static_assert(__is_same(decay_t<const S>, S));
+  static_assert(__is_same(decay_t<const S &>, __generic S));
+  static_assert(__is_same(decay_t<const S &&>, __generic S));
+  static_assert(__is_same(decay_t<volatile S>, S));
+  static_assert(__is_same(decay_t<volatile S &>, __generic S));
+  static_assert(__is_same(decay_t<volatile S &&>, __generic S));
+  static_assert(__is_same(decay_t<const volatile S>, S));
+  static_assert(__is_same(decay_t<const volatile S &>, __generic S));
+  static_assert(__is_same(decay_t<const volatile S &&>, __generic S));
+  static_assert(__is_same(decay_t<int S::*const volatile>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  static_assert(__is_same(decay_t<int (S::*const volatile)()>, int(S::*)()));
+#endif
+  static_assert(__is_same(decay_t<int S::*const volatile &>, int 
S::*__generic));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
+  static_assert(__is_same(decay_t<int (S::*const volatile &)()>, 
int(S::*__generic)()));
+#endif
+  static_assert(__is_same(decay_t<int S::*const volatile &&>, int 
S::*__generic));
+}
+#endif
 
 template <class T> struct CheckAbominableFunction {};
 template <class M>
@@ -4793,6 +5194,7 @@ struct CheckAbominableFunction<M S::*> {
   }
 };
 
+#if !defined(VANILLAOPENCLCPLUSPLUS)
 void check_abominable_function() {
   { CheckAbominableFunction<int (S::*)() &> x; }
   { CheckAbominableFunction<int (S::*)() &&> x; }
@@ -4806,6 +5208,7 @@ void check_abominable_function() {
   { CheckAbominableFunction<int (S::*)() const volatile &> x; }
   { CheckAbominableFunction<int (S::*)() const volatile &&> x; }
 }
+#endif
 
 template <class T> using make_signed_t = __make_signed(T);
 template <class T, class Expected>
@@ -4836,10 +5239,12 @@ enum UnscopedLongLong : long long {};
 enum UnscopedULongLong : unsigned long long {};
 enum class ScopedLongLong : long long {};
 enum class ScopedULongLong : unsigned long long {};
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
 enum class UnscopedInt128 : __int128 {};
 enum class ScopedInt128 : __int128 {};
 enum class UnscopedUInt128 : unsigned __int128 {};
 enum class ScopedUInt128 : unsigned __int128 {};
+#endif
 
 void make_signed() {
   check_make_signed<char, signed char>();
@@ -4853,8 +5258,10 @@ void make_signed() {
   check_make_signed<unsigned long, long>();
   check_make_signed<long long, long long>();
   check_make_signed<unsigned long long, long long>();
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   check_make_signed<__int128, __int128>();
   check_make_signed<__uint128_t, __int128>();
+#endif
   check_make_signed<_BitInt(65), _BitInt(65)>();
   check_make_signed<unsigned _BitInt(65), _BitInt(65)>();
 
@@ -4872,6 +5279,7 @@ void make_signed() {
   check_make_signed<UnscopedUChar, signed char>();
   check_make_signed<ScopedUChar, signed char>();
 
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   check_make_signed<UnscopedLongLong, Int64>();
   check_make_signed<UnscopedULongLong, Int64>();
   check_make_signed<ScopedLongLong, Int64>();
@@ -4881,6 +5289,7 @@ void make_signed() {
   check_make_signed<ScopedInt128, __int128>();
   check_make_signed<UnscopedUInt128, __int128>();
   check_make_signed<ScopedUInt128, __int128>();
+#endif
 
   { using ExpectedError = __make_signed(bool); }
   // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'bool'}}
@@ -4897,11 +5306,14 @@ void make_signed() {
   { using ExpectedError = __make_signed(void); }
   // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'void'}}
   { using ExpectedError = __make_signed(int *); }
-  // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int *'}}
+  // expected-noncl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int *'}}
+  // expected-cl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given '__generic int *'}}
   { using ExpectedError = __make_signed(int &); }
-  // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int &'}}
+  // expected-noncl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int &'}}
+  // expected-cl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given '__generic int &'}}
   { using ExpectedError = __make_signed(int &&); }
-  // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int &&'}}
+  // expected-noncl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int &&'}}
+  // expected-cl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given '__generic int &&'}}
   { using ExpectedError = __make_signed(float); }
   // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'float'}}
   { using ExpectedError = __make_signed(double); }
@@ -4911,11 +5323,14 @@ void make_signed() {
   { using ExpectedError = __make_signed(S); }
   // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'S'}}
   { using ExpectedError = __make_signed(S *); }
-  // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'S *'}}
+  // expected-noncl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'S *'}}
+  // expected-cl-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given '__generic S *'}}
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   { using ExpectedError = __make_signed(int S::*); }
   // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int S::*'}}
   { using ExpectedError = __make_signed(int(S::*)()); }
   // expected-error@*:*{{'make_signed' is only compatible with non-bool 
integers and enum types, but was given 'int (S::*)()'}}
+#endif
 }
 
 template <class T>
@@ -4941,8 +5356,10 @@ void make_unsigned() {
   check_make_unsigned<unsigned long, unsigned long>();
   check_make_unsigned<long long, unsigned long long>();
   check_make_unsigned<unsigned long long, unsigned long long>();
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   check_make_unsigned<__int128, __uint128_t>();
   check_make_unsigned<__uint128_t, __uint128_t>();
+#endif
   check_make_unsigned<_BitInt(65), unsigned _BitInt(65)>();
   check_make_unsigned<unsigned _BitInt(65), unsigned _BitInt(65)>();
 
@@ -4960,6 +5377,7 @@ void make_unsigned() {
   check_make_unsigned<UnscopedUChar, unsigned char>();
   check_make_unsigned<ScopedUChar, unsigned char>();
 
+#if !defined(VANILLAOPENCLCPLUSPLUS) && !defined(EXTOPENCLCPLUSPLUS)
   check_make_unsigned<UnscopedLongLong, UInt64>();
   check_make_unsigned<UnscopedULongLong, UInt64>();
   check_make_unsigned<ScopedLongLong, UInt64>();
@@ -4969,6 +5387,7 @@ void make_unsigned() {
   check_make_unsigned<ScopedInt128, unsigned __int128>();
   check_make_unsigned<UnscopedUInt128, unsigned __int128>();
   check_make_unsigned<ScopedUInt128, unsigned __int128>();
+#endif
 
   { using ExpectedError = __make_unsigned(bool); }
   // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'bool'}}
@@ -4985,11 +5404,14 @@ void make_unsigned() {
   { using ExpectedError = __make_unsigned(void); }
   // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'void'}}
   { using ExpectedError = __make_unsigned(int *); }
-  // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'int *'}}
+  // expected-noncl-error@*:*{{'make_unsigned' is only compatible with 
non-bool integers and enum types, but was given 'int *'}}
+  // expected-cl-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given '__generic int *'}}
   { using ExpectedError = __make_unsigned(int &); }
-  // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'int &'}}
+  // expected-noncl-error@*:*{{'make_unsigned' is only compatible with 
non-bool integers and enum types, but was given 'int &'}}
+  // expected-cl-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given '__generic int &'}}
   { using ExpectedError = __make_unsigned(int &&); }
-  // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'int &&'}}
+  // expected-noncl-error@*:*{{'make_unsigned' is only compatible with 
non-bool integers and enum types, but was given 'int &&'}}
+  // expected-cl-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given '__generic int &&'}}
   { using ExpectedError = __make_unsigned(float); }
   // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'float'}}
   { using ExpectedError = __make_unsigned(double); }
@@ -4999,11 +5421,14 @@ void make_unsigned() {
   { using ExpectedError = __make_unsigned(S); }
   // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'S'}}
   { using ExpectedError = __make_unsigned(S *); }
-  // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'S *'}}
+  // expected-noncl-error@*:*{{'make_unsigned' is only compatible with 
non-bool integers and enum types, but was given 'S *'}}
+  // expected-cl-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given '__generic S *'}}
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   { using ExpectedError = __make_unsigned(int S::*); }
   // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'int S::*'}}
   { using ExpectedError = __make_unsigned(int(S::*)()); }
   // expected-error@*:*{{'make_unsigned' is only compatible with non-bool 
integers and enum types, but was given 'int (S::*)()'}}
+#endif
 }
 
 template <class T> using remove_extent_t = __remove_extent(T);
@@ -5030,13 +5455,17 @@ void remove_extent() {
   static_assert(__is_same(remove_extent_t<int *>, int *));
   static_assert(__is_same(remove_extent_t<int &>, int &));
   static_assert(__is_same(remove_extent_t<int &&>, int &&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_extent_t<int()>, int()));
   static_assert(__is_same(remove_extent_t<int (*)()>, int (*)()));
   static_assert(__is_same(remove_extent_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(remove_extent_t<S>, S));
   static_assert(__is_same(remove_extent_t<int S::*>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_extent_t<int (S::*)()>, int(S::*)()));
+#endif
 
   using SomeArray = int[1][2];
   static_assert(__is_same(remove_extent_t<const SomeArray>, const int[2]));
@@ -5069,13 +5498,17 @@ void remove_all_extents() {
   static_assert(__is_same(remove_all_extents_t<int *>, int *));
   static_assert(__is_same(remove_all_extents_t<int &>, int &));
   static_assert(__is_same(remove_all_extents_t<int &&>, int &&));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_all_extents_t<int()>, int()));
   static_assert(__is_same(remove_all_extents_t<int (*)()>, int (*)()));
   static_assert(__is_same(remove_all_extents_t<int (&)()>, int (&)()));
+#endif
 
   static_assert(__is_same(remove_all_extents_t<S>, S));
   static_assert(__is_same(remove_all_extents_t<int S::*>, int S::*));
+#if !defined(VANILLAOPENCLCPLUSPLUS)
   static_assert(__is_same(remove_all_extents_t<int (S::*)()>, int(S::*)()));
+#endif
 
   using SomeArray = int[1][2];
   static_assert(__is_same(remove_all_extents_t<const SomeArray>, const int));
diff --git a/clang/test/SemaOpenCLCXX/address-space-traits.clcpp 
b/clang/test/SemaOpenCLCXX/address-space-traits.clcpp
new file mode 100644
index 0000000000000..adb71c2105ea8
--- /dev/null
+++ b/clang/test/SemaOpenCLCXX/address-space-traits.clcpp
@@ -0,0 +1,29 @@
+//RUN: %clang_cc1 %s -triple spirv64-unknown-unknown -pedantic -fsyntax-only 
-verify -cl-ext=+__cl_clang_function_pointers,+__opencl_c_generic_address_space
+
+#pragma OPENCL EXTENSION __cl_clang_function_pointers : enable
+
+template <class T> using remove_pointer_t = __remove_pointer(T);
+static_assert(__is_same(remove_pointer_t<int (*)()>, int()));
+
+static_assert(__is_same(remove_pointer_t<int (*)()>, int()));
+
+static_assert(__is_same(remove_pointer_t<int (&)()>, int (&)()));
+
+template <class T> using remove_reference_t = __remove_reference_t(T);
+
+static_assert(__is_same(remove_reference_t<int (&)()>, int()));
+static_assert(__is_same(remove_reference_t<int (&)()>, void()));
+  // expected-error@-1 {{static assertion failed due to requirement 
'__is_same(int (), void ())'}}
+
+static_assert(!__is_same(remove_reference_t<__add_lvalue_reference(int 
(*)())>, int));
+
+struct S {
+  int foo() __local;
+};
+
+// FIXME: this fails since address-space is not preserved on member-function 
when speciefied (2nd parameter)
+//static_assert(!__is_same(remove_pointer_t<decltype(&S::foo)>, int (S::*)() 
const __local));
+//static_assert(__is_same(remove_pointer_t<decltype(&S::foo)>, int (S::*)() 
__local));
+
+//static_assert(!__is_same(remove_reference_t<decltype(&S::foo)>, int (S::*)() 
const __local));
+//static_assert(__is_same(remove_reference_t<decltype(&S::foo)>, int (S::*)() 
__local));

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to