teak-llvm/clang/test/Sema/ext_vector_components.c
Pirama Arumuga Nainar 98eaa62e36 Add .rgba syntax extension to ext_vector_type types
Summary:
This patch enables .rgba accessors to ext_vector_type types and adds
tests for syntax validation and code generation.

'a' and 'b' can appear either in the point access mode or the numeric
access mode (for indices 10 and 11).  To disambiguate between the two
usages, the accessor type is explicitly passed to relevant methods.

Reviewers: rsmith

Subscribers: Anastasia, bader, srhines, cfe-commits

Differential Revision: http://reviews.llvm.org/D20602

llvm-svn: 276455
2016-07-22 18:49:43 +00:00

75 lines
3.2 KiB
C

// RUN: %clang_cc1 -fsyntax-only -verify %s
typedef __attribute__(( ext_vector_type(2) )) float float2;
typedef __attribute__(( ext_vector_type(3) )) float float3;
typedef __attribute__(( ext_vector_type(4) )) float float4;
typedef __attribute__(( ext_vector_type(16) )) float float16;
static float4 vec4_0 = (float4)0.5f;
static void test() {
float2 vec2, vec2_2;
float3 vec3;
float4 vec4, vec4_2, *vec4p;
float16 vec16;
float f;
vec2.z; // expected-error {{vector component access exceeds type 'float2'}}
vec2.xyzw; // expected-error {{vector component access exceeds type 'float2'}}
vec4.xyzw; // expected-warning {{expression result unused}}
vec4.xyzc; // expected-error {{illegal vector component name 'c'}}
vec4.s01z; // expected-error {{illegal vector component name 'z'}}
vec2 = vec4.s01; // legal, shorten
vec2 = vec4.S01; // legal, shorten
vec3 = vec4.xyz; // legal, shorten
f = vec2.x; // legal, shorten
f = vec4.xy.x; // legal, shorten
vec4_2.xyzx = vec4.xyzw; // expected-error {{vector is not assignable (contains duplicate components)}}
vec4_2.xyzz = vec4.xyzw; // expected-error {{vector is not assignable (contains duplicate components)}}
vec4_2.xyyw = vec4.xyzw; // expected-error {{vector is not assignable (contains duplicate components)}}
vec2.x = f;
vec2.xx = vec2_2.xy; // expected-error {{vector is not assignable (contains duplicate components)}}
vec2.yx = vec2_2.xy;
vec4 = (float4){ 1,2,3,4 };
vec4.xy.w; // expected-error {{vector component access exceeds type 'float2'}}
vec4.s06; // expected-error {{vector component access exceeds type 'float4'}}
vec4.x = vec16.sf;
vec4.x = vec16.sF;
vec4p->yz = vec4p->xy;
vec2.a; // expected-error {{vector component access exceeds type 'float2'}}
vec2.rgba; // expected-error {{vector component access exceeds type 'float2'}}
vec4.rgba; // expected-warning {{expression result unused}}
vec4.rgbz; // expected-error {{illegal vector component name 'z'}}
vec4.rgbc; // expected-error {{illegal vector component name 'c'}}
vec4.xyzr; // expected-error {{illegal vector component name 'r'}}
vec4.s01b; // expected-error {{vector component access exceeds type 'float4'}}
vec3 = vec4.rgb; // legal, shorten
f = vec2.r; // legal, shorten
f = vec4.rg.r; // legal, shorten
vec4_2.rgba = vec4.xyzw; // legal, no intermingling
vec4_2.rgbr = vec4.rgba; // expected-error {{vector is not assignable (contains duplicate components)}}
vec4_2.rgbb = vec4.rgba; // expected-error {{vector is not assignable (contains duplicate components)}}
vec4_2.rgga = vec4.rgba; // expected-error {{vector is not assignable (contains duplicate components)}}
vec2.x = f;
vec2.rr = vec2_2.rg; // expected-error {{vector is not assignable (contains duplicate components)}}
vec2.gr = vec2_2.rg;
vec2.gr.g = vec2_2.r;
vec4 = (float4){ 1,2,3,4 };
vec4.rg.b; // expected-error {{vector component access exceeds type 'float2'}}
vec4.r = vec16.sf;
vec4.g = vec16.sF;
vec4p->gb = vec4p->rg;
}
float2 lo(float3 x) { return x.lo; }
float2 hi(float3 x) { return x.hi; }
float2 ev(float3 x) { return x.even; }
float2 od(float3 x) { return x.odd; }