tint/intrinsics.def: Add @test_value() annotation

Specifies the value to use for argument values when generating end-to-end tests.

Use this to provide a legal value for atanh().

Change-Id: I008050c856f9d687ab918c68e90678c4e74f3a1d
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/106887
Kokoro: Kokoro <noreply+kokoro@google.com>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
This commit is contained in:
Ben Clayton 2022-10-25 13:08:45 +00:00
parent c3adc78cbc
commit 95dd428c75
69 changed files with 394 additions and 313 deletions

View File

@ -423,8 +423,8 @@ fn asinh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
@const fn atan<N: num, T: fa_f32_f16>(vec<N, T>) -> vec<N, T>
@const fn atan2<T: fa_f32_f16>(T, T) -> T
@const fn atan2<T: fa_f32_f16, N: num>(vec<N, T>, vec<N, T>) -> vec<N, T>
fn atanh<T: f32_f16>(T) -> T
fn atanh<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
fn atanh<T: f32_f16>(@test_value(0.5) T) -> T
fn atanh<N: num, T: f32_f16>(@test_value(0.5) vec<N, T>) -> vec<N, T>
fn ceil<T: f32_f16>(T) -> T
fn ceil<N: num, T: f32_f16>(vec<N, T>) -> vec<N, T>
@const fn clamp<T: fia_fiu32_f16>(T, T, T) -> T

View File

@ -13997,8 +13997,8 @@ constexpr IntrinsicInfo kBuiltins[] = {
},
{
/* [10] */
/* fn atanh<T : f32_f16>(T) -> T */
/* fn atanh<N : num, T : f32_f16>(vec<N, T>) -> vec<N, T> */
/* fn atanh<T : f32_f16>(@test_value(0.5) T) -> T */
/* fn atanh<N : num, T : f32_f16>(@test_value(0.5) vec<N, T>) -> vec<N, T> */
/* num overloads */ 2,
/* overloads */ &kOverloads[404],
},

View File

@ -265,17 +265,22 @@ enable f16;
{{- /* Returns a value that can be used for the parameter argument */ -}}
{{- /* ------------------------------------------------------------------ */ -}}
{{- $ty := .Type -}}
{{- if eq $ty.Target.Name "i32" -}}1i
{{- else if eq $ty.Target.Name "u32" -}}1u
{{- else if eq $ty.Target.Name "f32" -}}1.f
{{- else if eq $ty.Target.Name "fa" -}}1
{{- else if eq $ty.Target.Name "ia" -}}1.0
{{- $value := printf "%v" .TestValue }}
{{- /* $float_value is $value with a '.' suffix (if it wasn't a float already) */ -}}
{{- $float_value := $value }}
{{- if not (Contains $value ".") }}{{$float_value = printf "%v." $value}}{{end}}
{{- /* emit the value with any necessary suffixes */ -}}
{{- if eq $ty.Target.Name "i32" -}}{{$value}}i
{{- else if eq $ty.Target.Name "u32" -}}{{$value}}u
{{- else if eq $ty.Target.Name "f32" -}}{{$float_value}}f
{{- else if eq $ty.Target.Name "fa" -}}{{$value}}
{{- else if eq $ty.Target.Name "ia" -}}{{$float_value}}0
{{- else if eq $ty.Target.Name "bool" -}}true
{{- else if eq $ty.Target.Name "vec" -}}
{{- $el := Eval "ArgumentValue" "Type" (ElementType .Type) "Name" ""}}
{{- $el := Eval "ArgumentValue" "Type" (ElementType .Type) "Name" "" "TestValue" .TestValue }}
{{- template "Type" $ty}}({{$el}})
{{- else if eq $ty.Target.Name "mat" -}}{{template "Type" $ty}}(
{{- $el := Eval "ArgumentValue" "Type" (ElementType .Type) "Name" ""}}
{{- $el := Eval "ArgumentValue" "Type" (ElementType .Type) "Name" "" "TestValue" .TestValue }}
{{- range $col := Iterate (index $ty.TemplateArguments 0) }}
{{- range $row := Iterate (index $ty.TemplateArguments 1) }}
{{- if or $col $row -}}, {{end}}{{$el}}

View File

@ -23,7 +23,7 @@
// fn atanh(vec<3, f32>) -> vec<3, f32>
fn atanh_440cca() {
var res: vec3<f32> = atanh(vec3<f32>(1.f));
var res: vec3<f32> = atanh(vec3<f32>(0.5f));
}
@vertex

View File

@ -3,7 +3,7 @@ float3 tint_atanh(float3 x) {
}
void atanh_440cca() {
float3 res = tint_atanh((1.0f).xxx);
float3 res = tint_atanh((0.5f).xxx);
}
struct tint_symbol {

View File

@ -3,7 +3,7 @@ float3 tint_atanh(float3 x) {
}
void atanh_440cca() {
float3 res = tint_atanh((1.0f).xxx);
float3 res = tint_atanh((0.5f).xxx);
}
struct tint_symbol {

View File

@ -5,7 +5,7 @@ vec3 tint_atanh(vec3 x) {
}
void atanh_440cca() {
vec3 res = tint_atanh(vec3(1.0f));
vec3 res = tint_atanh(vec3(0.5f));
}
vec4 vertex_main() {
@ -29,7 +29,7 @@ vec3 tint_atanh(vec3 x) {
}
void atanh_440cca() {
vec3 res = tint_atanh(vec3(1.0f));
vec3 res = tint_atanh(vec3(0.5f));
}
void fragment_main() {
@ -47,7 +47,7 @@ vec3 tint_atanh(vec3 x) {
}
void atanh_440cca() {
vec3 res = tint_atanh(vec3(1.0f));
vec3 res = tint_atanh(vec3(0.5f));
}
void compute_main() {

View File

@ -6,7 +6,7 @@ float3 tint_atanh(float3 x) {
}
void atanh_440cca() {
float3 res = tint_atanh(float3(1.0f));
float3 res = tint_atanh(float3(0.5f));
}
struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 43
; Bound: 45
; Schema: 0
OpCapability Shader
%22 = OpExtInstImport "GLSL.std.450"
@ -40,8 +40,10 @@
%20 = OpConstantNull %v3float
%void = OpTypeVoid
%23 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%29 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5
%_ptr_Function_v3float = OpTypePointer Function %v3float
%30 = OpTypeFunction %v4float
%32 = OpTypeFunction %v4float
%tint_atanh = OpFunction %v3float None %9
%x = OpFunctionParameter %v3float
%13 = OpLabel
@ -53,29 +55,29 @@
%atanh_440cca = OpFunction %void None %23
%26 = OpLabel
%res = OpVariable %_ptr_Function_v3float Function %20
%27 = OpFunctionCall %v3float %tint_atanh %16
%27 = OpFunctionCall %v3float %tint_atanh %29
OpStore %res %27
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %30
%32 = OpLabel
%33 = OpFunctionCall %void %atanh_440cca
%vertex_main_inner = OpFunction %v4float None %32
%34 = OpLabel
%35 = OpFunctionCall %void %atanh_440cca
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %23
%35 = OpLabel
%36 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %36
%37 = OpLabel
%38 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %38
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %23
%38 = OpLabel
%39 = OpFunctionCall %void %atanh_440cca
%40 = OpLabel
%41 = OpFunctionCall %void %atanh_440cca
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %23
%41 = OpLabel
%42 = OpFunctionCall %void %atanh_440cca
%43 = OpLabel
%44 = OpFunctionCall %void %atanh_440cca
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_440cca() {
var res : vec3<f32> = atanh(vec3<f32>(1.0f));
var res : vec3<f32> = atanh(vec3<f32>(0.5f));
}
@vertex

View File

@ -23,7 +23,7 @@
// fn atanh(f32) -> f32
fn atanh_7997d8() {
var res: f32 = atanh(1.f);
var res: f32 = atanh(0.5f);
}
@vertex

View File

@ -3,7 +3,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float res = tint_atanh(1.0f);
float res = tint_atanh(0.5f);
}
struct tint_symbol {

View File

@ -3,7 +3,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float res = tint_atanh(1.0f);
float res = tint_atanh(0.5f);
}
struct tint_symbol {

View File

@ -5,7 +5,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float res = tint_atanh(1.0f);
float res = tint_atanh(0.5f);
}
vec4 vertex_main() {
@ -29,7 +29,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float res = tint_atanh(1.0f);
float res = tint_atanh(0.5f);
}
void fragment_main() {
@ -47,7 +47,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float res = tint_atanh(1.0f);
float res = tint_atanh(0.5f);
}
void compute_main() {

View File

@ -6,7 +6,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float res = tint_atanh(1.0f);
float res = tint_atanh(0.5f);
}
struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 39
; Bound: 40
; Schema: 0
OpCapability Shader
%18 = OpExtInstImport "GLSL.std.450"
@ -36,8 +36,9 @@
%bool = OpTypeBool
%void = OpTypeVoid
%19 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%_ptr_Function_float = OpTypePointer Function %float
%26 = OpTypeFunction %v4float
%27 = OpTypeFunction %v4float
%tint_atanh = OpFunction %float None %9
%x = OpFunctionParameter %float
%12 = OpLabel
@ -49,29 +50,29 @@
%atanh_7997d8 = OpFunction %void None %19
%22 = OpLabel
%res = OpVariable %_ptr_Function_float Function %8
%23 = OpFunctionCall %float %tint_atanh %float_1
%23 = OpFunctionCall %float %tint_atanh %float_0_5
OpStore %res %23
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %26
%28 = OpLabel
%29 = OpFunctionCall %void %atanh_7997d8
%vertex_main_inner = OpFunction %v4float None %27
%29 = OpLabel
%30 = OpFunctionCall %void %atanh_7997d8
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %19
%31 = OpLabel
%32 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %32
%32 = OpLabel
%33 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %33
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %19
%34 = OpLabel
%35 = OpFunctionCall %void %atanh_7997d8
%35 = OpLabel
%36 = OpFunctionCall %void %atanh_7997d8
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %19
%37 = OpLabel
%38 = OpFunctionCall %void %atanh_7997d8
%38 = OpLabel
%39 = OpFunctionCall %void %atanh_7997d8
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_7997d8() {
var res : f32 = atanh(1.0f);
var res : f32 = atanh(0.5f);
}
@vertex

View File

@ -23,7 +23,7 @@
// fn atanh(vec<2, f32>) -> vec<2, f32>
fn atanh_c0e634() {
var res: vec2<f32> = atanh(vec2<f32>(1.f));
var res: vec2<f32> = atanh(vec2<f32>(0.5f));
}
@vertex

View File

@ -3,7 +3,7 @@ float2 tint_atanh(float2 x) {
}
void atanh_c0e634() {
float2 res = tint_atanh((1.0f).xx);
float2 res = tint_atanh((0.5f).xx);
}
struct tint_symbol {

View File

@ -3,7 +3,7 @@ float2 tint_atanh(float2 x) {
}
void atanh_c0e634() {
float2 res = tint_atanh((1.0f).xx);
float2 res = tint_atanh((0.5f).xx);
}
struct tint_symbol {

View File

@ -5,7 +5,7 @@ vec2 tint_atanh(vec2 x) {
}
void atanh_c0e634() {
vec2 res = tint_atanh(vec2(1.0f));
vec2 res = tint_atanh(vec2(0.5f));
}
vec4 vertex_main() {
@ -29,7 +29,7 @@ vec2 tint_atanh(vec2 x) {
}
void atanh_c0e634() {
vec2 res = tint_atanh(vec2(1.0f));
vec2 res = tint_atanh(vec2(0.5f));
}
void fragment_main() {
@ -47,7 +47,7 @@ vec2 tint_atanh(vec2 x) {
}
void atanh_c0e634() {
vec2 res = tint_atanh(vec2(1.0f));
vec2 res = tint_atanh(vec2(0.5f));
}
void compute_main() {

View File

@ -6,7 +6,7 @@ float2 tint_atanh(float2 x) {
}
void atanh_c0e634() {
float2 res = tint_atanh(float2(1.0f));
float2 res = tint_atanh(float2(0.5f));
}
struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 43
; Bound: 45
; Schema: 0
OpCapability Shader
%22 = OpExtInstImport "GLSL.std.450"
@ -40,8 +40,10 @@
%20 = OpConstantNull %v2float
%void = OpTypeVoid
%23 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%29 = OpConstantComposite %v2float %float_0_5 %float_0_5
%_ptr_Function_v2float = OpTypePointer Function %v2float
%30 = OpTypeFunction %v4float
%32 = OpTypeFunction %v4float
%tint_atanh = OpFunction %v2float None %9
%x = OpFunctionParameter %v2float
%13 = OpLabel
@ -53,29 +55,29 @@
%atanh_c0e634 = OpFunction %void None %23
%26 = OpLabel
%res = OpVariable %_ptr_Function_v2float Function %20
%27 = OpFunctionCall %v2float %tint_atanh %16
%27 = OpFunctionCall %v2float %tint_atanh %29
OpStore %res %27
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %30
%32 = OpLabel
%33 = OpFunctionCall %void %atanh_c0e634
%vertex_main_inner = OpFunction %v4float None %32
%34 = OpLabel
%35 = OpFunctionCall %void %atanh_c0e634
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %23
%35 = OpLabel
%36 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %36
%37 = OpLabel
%38 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %38
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %23
%38 = OpLabel
%39 = OpFunctionCall %void %atanh_c0e634
%40 = OpLabel
%41 = OpFunctionCall %void %atanh_c0e634
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %23
%41 = OpLabel
%42 = OpFunctionCall %void %atanh_c0e634
%43 = OpLabel
%44 = OpFunctionCall %void %atanh_c0e634
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_c0e634() {
var res : vec2<f32> = atanh(vec2<f32>(1.0f));
var res : vec2<f32> = atanh(vec2<f32>(0.5f));
}
@vertex

View File

@ -23,7 +23,7 @@
// fn atanh(vec<4, f32>) -> vec<4, f32>
fn atanh_f3e01b() {
var res: vec4<f32> = atanh(vec4<f32>(1.f));
var res: vec4<f32> = atanh(vec4<f32>(0.5f));
}
@vertex

View File

@ -3,7 +3,7 @@ float4 tint_atanh(float4 x) {
}
void atanh_f3e01b() {
float4 res = tint_atanh((1.0f).xxxx);
float4 res = tint_atanh((0.5f).xxxx);
}
struct tint_symbol {

View File

@ -3,7 +3,7 @@ float4 tint_atanh(float4 x) {
}
void atanh_f3e01b() {
float4 res = tint_atanh((1.0f).xxxx);
float4 res = tint_atanh((0.5f).xxxx);
}
struct tint_symbol {

View File

@ -5,7 +5,7 @@ vec4 tint_atanh(vec4 x) {
}
void atanh_f3e01b() {
vec4 res = tint_atanh(vec4(1.0f));
vec4 res = tint_atanh(vec4(0.5f));
}
vec4 vertex_main() {
@ -29,7 +29,7 @@ vec4 tint_atanh(vec4 x) {
}
void atanh_f3e01b() {
vec4 res = tint_atanh(vec4(1.0f));
vec4 res = tint_atanh(vec4(0.5f));
}
void fragment_main() {
@ -47,7 +47,7 @@ vec4 tint_atanh(vec4 x) {
}
void atanh_f3e01b() {
vec4 res = tint_atanh(vec4(1.0f));
vec4 res = tint_atanh(vec4(0.5f));
}
void compute_main() {

View File

@ -6,7 +6,7 @@ float4 tint_atanh(float4 x) {
}
void atanh_f3e01b() {
float4 res = tint_atanh(float4(1.0f));
float4 res = tint_atanh(float4(0.5f));
}
struct tint_symbol {

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 41
; Bound: 43
; Schema: 0
OpCapability Shader
%20 = OpExtInstImport "GLSL.std.450"
@ -38,8 +38,10 @@
%v4bool = OpTypeVector %bool 4
%void = OpTypeVoid
%21 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%27 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%_ptr_Function_v4float = OpTypePointer Function %v4float
%28 = OpTypeFunction %v4float
%30 = OpTypeFunction %v4float
%tint_atanh = OpFunction %v4float None %9
%x = OpFunctionParameter %v4float
%12 = OpLabel
@ -51,29 +53,29 @@
%atanh_f3e01b = OpFunction %void None %21
%24 = OpLabel
%res = OpVariable %_ptr_Function_v4float Function %5
%25 = OpFunctionCall %v4float %tint_atanh %15
%25 = OpFunctionCall %v4float %tint_atanh %27
OpStore %res %25
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %28
%30 = OpLabel
%31 = OpFunctionCall %void %atanh_f3e01b
%vertex_main_inner = OpFunction %v4float None %30
%32 = OpLabel
%33 = OpFunctionCall %void %atanh_f3e01b
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %21
%33 = OpLabel
%34 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %34
%35 = OpLabel
%36 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %36
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %21
%36 = OpLabel
%37 = OpFunctionCall %void %atanh_f3e01b
%38 = OpLabel
%39 = OpFunctionCall %void %atanh_f3e01b
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %21
%39 = OpLabel
%40 = OpFunctionCall %void %atanh_f3e01b
%41 = OpLabel
%42 = OpFunctionCall %void %atanh_f3e01b
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_f3e01b() {
var res : vec4<f32> = atanh(vec4<f32>(1.0f));
var res : vec4<f32> = atanh(vec4<f32>(0.5f));
}
@vertex

View File

@ -23,7 +23,7 @@
// fn atanh(vec<3, f32>) -> vec<3, f32>
fn atanh_440cca() {
var arg_0 = vec3<f32>(1.f);
var arg_0 = vec3<f32>(0.5f);
var res: vec3<f32> = atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float3 tint_atanh(float3 x) {
}
void atanh_440cca() {
float3 arg_0 = (1.0f).xxx;
float3 arg_0 = (0.5f).xxx;
float3 res = tint_atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float3 tint_atanh(float3 x) {
}
void atanh_440cca() {
float3 arg_0 = (1.0f).xxx;
float3 arg_0 = (0.5f).xxx;
float3 res = tint_atanh(arg_0);
}

View File

@ -5,7 +5,7 @@ vec3 tint_atanh(vec3 x) {
}
void atanh_440cca() {
vec3 arg_0 = vec3(1.0f);
vec3 arg_0 = vec3(0.5f);
vec3 res = tint_atanh(arg_0);
}
@ -30,7 +30,7 @@ vec3 tint_atanh(vec3 x) {
}
void atanh_440cca() {
vec3 arg_0 = vec3(1.0f);
vec3 arg_0 = vec3(0.5f);
vec3 res = tint_atanh(arg_0);
}
@ -49,7 +49,7 @@ vec3 tint_atanh(vec3 x) {
}
void atanh_440cca() {
vec3 arg_0 = vec3(1.0f);
vec3 arg_0 = vec3(0.5f);
vec3 res = tint_atanh(arg_0);
}

View File

@ -6,7 +6,7 @@ float3 tint_atanh(float3 x) {
}
void atanh_440cca() {
float3 arg_0 = float3(1.0f);
float3 arg_0 = float3(0.5f);
float3 res = tint_atanh(arg_0);
}

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 45
; Bound: 47
; Schema: 0
OpCapability Shader
%22 = OpExtInstImport "GLSL.std.450"
@ -41,8 +41,10 @@
%20 = OpConstantNull %v3float
%void = OpTypeVoid
%23 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%28 = OpConstantComposite %v3float %float_0_5 %float_0_5 %float_0_5
%_ptr_Function_v3float = OpTypePointer Function %v3float
%32 = OpTypeFunction %v4float
%34 = OpTypeFunction %v4float
%tint_atanh = OpFunction %v3float None %9
%x = OpFunctionParameter %v3float
%13 = OpLabel
@ -55,31 +57,31 @@
%26 = OpLabel
%arg_0 = OpVariable %_ptr_Function_v3float Function %20
%res = OpVariable %_ptr_Function_v3float Function %20
OpStore %arg_0 %16
%30 = OpLoad %v3float %arg_0
%29 = OpFunctionCall %v3float %tint_atanh %30
OpStore %res %29
OpStore %arg_0 %28
%32 = OpLoad %v3float %arg_0
%31 = OpFunctionCall %v3float %tint_atanh %32
OpStore %res %31
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %32
%34 = OpLabel
%35 = OpFunctionCall %void %atanh_440cca
%vertex_main_inner = OpFunction %v4float None %34
%36 = OpLabel
%37 = OpFunctionCall %void %atanh_440cca
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %23
%37 = OpLabel
%38 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %38
%39 = OpLabel
%40 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %40
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %23
%40 = OpLabel
%41 = OpFunctionCall %void %atanh_440cca
%42 = OpLabel
%43 = OpFunctionCall %void %atanh_440cca
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %23
%43 = OpLabel
%44 = OpFunctionCall %void %atanh_440cca
%45 = OpLabel
%46 = OpFunctionCall %void %atanh_440cca
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_440cca() {
var arg_0 = vec3<f32>(1.0f);
var arg_0 = vec3<f32>(0.5f);
var res : vec3<f32> = atanh(arg_0);
}

View File

@ -23,7 +23,7 @@
// fn atanh(f32) -> f32
fn atanh_7997d8() {
var arg_0 = 1.f;
var arg_0 = 0.5f;
var res: f32 = atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float arg_0 = 1.0f;
float arg_0 = 0.5f;
float res = tint_atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float arg_0 = 1.0f;
float arg_0 = 0.5f;
float res = tint_atanh(arg_0);
}

View File

@ -5,7 +5,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float arg_0 = 1.0f;
float arg_0 = 0.5f;
float res = tint_atanh(arg_0);
}
@ -30,7 +30,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float arg_0 = 1.0f;
float arg_0 = 0.5f;
float res = tint_atanh(arg_0);
}
@ -49,7 +49,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float arg_0 = 1.0f;
float arg_0 = 0.5f;
float res = tint_atanh(arg_0);
}

View File

@ -6,7 +6,7 @@ float tint_atanh(float x) {
}
void atanh_7997d8() {
float arg_0 = 1.0f;
float arg_0 = 0.5f;
float res = tint_atanh(arg_0);
}

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 41
; Bound: 42
; Schema: 0
OpCapability Shader
%18 = OpExtInstImport "GLSL.std.450"
@ -37,8 +37,9 @@
%bool = OpTypeBool
%void = OpTypeVoid
%19 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%_ptr_Function_float = OpTypePointer Function %float
%28 = OpTypeFunction %v4float
%29 = OpTypeFunction %v4float
%tint_atanh = OpFunction %float None %9
%x = OpFunctionParameter %float
%12 = OpLabel
@ -51,31 +52,31 @@
%22 = OpLabel
%arg_0 = OpVariable %_ptr_Function_float Function %8
%res = OpVariable %_ptr_Function_float Function %8
OpStore %arg_0 %float_1
%26 = OpLoad %float %arg_0
%25 = OpFunctionCall %float %tint_atanh %26
OpStore %res %25
OpStore %arg_0 %float_0_5
%27 = OpLoad %float %arg_0
%26 = OpFunctionCall %float %tint_atanh %27
OpStore %res %26
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %28
%30 = OpLabel
%31 = OpFunctionCall %void %atanh_7997d8
%vertex_main_inner = OpFunction %v4float None %29
%31 = OpLabel
%32 = OpFunctionCall %void %atanh_7997d8
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %19
%33 = OpLabel
%34 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %34
%34 = OpLabel
%35 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %35
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %19
%36 = OpLabel
%37 = OpFunctionCall %void %atanh_7997d8
%37 = OpLabel
%38 = OpFunctionCall %void %atanh_7997d8
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %19
%39 = OpLabel
%40 = OpFunctionCall %void %atanh_7997d8
%40 = OpLabel
%41 = OpFunctionCall %void %atanh_7997d8
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_7997d8() {
var arg_0 = 1.0f;
var arg_0 = 0.5f;
var res : f32 = atanh(arg_0);
}

View File

@ -23,7 +23,7 @@
// fn atanh(vec<2, f32>) -> vec<2, f32>
fn atanh_c0e634() {
var arg_0 = vec2<f32>(1.f);
var arg_0 = vec2<f32>(0.5f);
var res: vec2<f32> = atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float2 tint_atanh(float2 x) {
}
void atanh_c0e634() {
float2 arg_0 = (1.0f).xx;
float2 arg_0 = (0.5f).xx;
float2 res = tint_atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float2 tint_atanh(float2 x) {
}
void atanh_c0e634() {
float2 arg_0 = (1.0f).xx;
float2 arg_0 = (0.5f).xx;
float2 res = tint_atanh(arg_0);
}

View File

@ -5,7 +5,7 @@ vec2 tint_atanh(vec2 x) {
}
void atanh_c0e634() {
vec2 arg_0 = vec2(1.0f);
vec2 arg_0 = vec2(0.5f);
vec2 res = tint_atanh(arg_0);
}
@ -30,7 +30,7 @@ vec2 tint_atanh(vec2 x) {
}
void atanh_c0e634() {
vec2 arg_0 = vec2(1.0f);
vec2 arg_0 = vec2(0.5f);
vec2 res = tint_atanh(arg_0);
}
@ -49,7 +49,7 @@ vec2 tint_atanh(vec2 x) {
}
void atanh_c0e634() {
vec2 arg_0 = vec2(1.0f);
vec2 arg_0 = vec2(0.5f);
vec2 res = tint_atanh(arg_0);
}

View File

@ -6,7 +6,7 @@ float2 tint_atanh(float2 x) {
}
void atanh_c0e634() {
float2 arg_0 = float2(1.0f);
float2 arg_0 = float2(0.5f);
float2 res = tint_atanh(arg_0);
}

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 45
; Bound: 47
; Schema: 0
OpCapability Shader
%22 = OpExtInstImport "GLSL.std.450"
@ -41,8 +41,10 @@
%20 = OpConstantNull %v2float
%void = OpTypeVoid
%23 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%28 = OpConstantComposite %v2float %float_0_5 %float_0_5
%_ptr_Function_v2float = OpTypePointer Function %v2float
%32 = OpTypeFunction %v4float
%34 = OpTypeFunction %v4float
%tint_atanh = OpFunction %v2float None %9
%x = OpFunctionParameter %v2float
%13 = OpLabel
@ -55,31 +57,31 @@
%26 = OpLabel
%arg_0 = OpVariable %_ptr_Function_v2float Function %20
%res = OpVariable %_ptr_Function_v2float Function %20
OpStore %arg_0 %16
%30 = OpLoad %v2float %arg_0
%29 = OpFunctionCall %v2float %tint_atanh %30
OpStore %res %29
OpStore %arg_0 %28
%32 = OpLoad %v2float %arg_0
%31 = OpFunctionCall %v2float %tint_atanh %32
OpStore %res %31
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %32
%34 = OpLabel
%35 = OpFunctionCall %void %atanh_c0e634
%vertex_main_inner = OpFunction %v4float None %34
%36 = OpLabel
%37 = OpFunctionCall %void %atanh_c0e634
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %23
%37 = OpLabel
%38 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %38
%39 = OpLabel
%40 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %40
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %23
%40 = OpLabel
%41 = OpFunctionCall %void %atanh_c0e634
%42 = OpLabel
%43 = OpFunctionCall %void %atanh_c0e634
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %23
%43 = OpLabel
%44 = OpFunctionCall %void %atanh_c0e634
%45 = OpLabel
%46 = OpFunctionCall %void %atanh_c0e634
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_c0e634() {
var arg_0 = vec2<f32>(1.0f);
var arg_0 = vec2<f32>(0.5f);
var res : vec2<f32> = atanh(arg_0);
}

View File

@ -23,7 +23,7 @@
// fn atanh(vec<4, f32>) -> vec<4, f32>
fn atanh_f3e01b() {
var arg_0 = vec4<f32>(1.f);
var arg_0 = vec4<f32>(0.5f);
var res: vec4<f32> = atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float4 tint_atanh(float4 x) {
}
void atanh_f3e01b() {
float4 arg_0 = (1.0f).xxxx;
float4 arg_0 = (0.5f).xxxx;
float4 res = tint_atanh(arg_0);
}

View File

@ -3,7 +3,7 @@ float4 tint_atanh(float4 x) {
}
void atanh_f3e01b() {
float4 arg_0 = (1.0f).xxxx;
float4 arg_0 = (0.5f).xxxx;
float4 res = tint_atanh(arg_0);
}

View File

@ -5,7 +5,7 @@ vec4 tint_atanh(vec4 x) {
}
void atanh_f3e01b() {
vec4 arg_0 = vec4(1.0f);
vec4 arg_0 = vec4(0.5f);
vec4 res = tint_atanh(arg_0);
}
@ -30,7 +30,7 @@ vec4 tint_atanh(vec4 x) {
}
void atanh_f3e01b() {
vec4 arg_0 = vec4(1.0f);
vec4 arg_0 = vec4(0.5f);
vec4 res = tint_atanh(arg_0);
}
@ -49,7 +49,7 @@ vec4 tint_atanh(vec4 x) {
}
void atanh_f3e01b() {
vec4 arg_0 = vec4(1.0f);
vec4 arg_0 = vec4(0.5f);
vec4 res = tint_atanh(arg_0);
}

View File

@ -6,7 +6,7 @@ float4 tint_atanh(float4 x) {
}
void atanh_f3e01b() {
float4 arg_0 = float4(1.0f);
float4 arg_0 = float4(0.5f);
float4 res = tint_atanh(arg_0);
}

View File

@ -1,7 +1,7 @@
; SPIR-V
; Version: 1.3
; Generator: Google Tint Compiler; 0
; Bound: 43
; Bound: 45
; Schema: 0
OpCapability Shader
%20 = OpExtInstImport "GLSL.std.450"
@ -39,8 +39,10 @@
%v4bool = OpTypeVector %bool 4
%void = OpTypeVoid
%21 = OpTypeFunction %void
%float_0_5 = OpConstant %float 0.5
%26 = OpConstantComposite %v4float %float_0_5 %float_0_5 %float_0_5 %float_0_5
%_ptr_Function_v4float = OpTypePointer Function %v4float
%30 = OpTypeFunction %v4float
%32 = OpTypeFunction %v4float
%tint_atanh = OpFunction %v4float None %9
%x = OpFunctionParameter %v4float
%12 = OpLabel
@ -53,31 +55,31 @@
%24 = OpLabel
%arg_0 = OpVariable %_ptr_Function_v4float Function %5
%res = OpVariable %_ptr_Function_v4float Function %5
OpStore %arg_0 %15
%28 = OpLoad %v4float %arg_0
%27 = OpFunctionCall %v4float %tint_atanh %28
OpStore %res %27
OpStore %arg_0 %26
%30 = OpLoad %v4float %arg_0
%29 = OpFunctionCall %v4float %tint_atanh %30
OpStore %res %29
OpReturn
OpFunctionEnd
%vertex_main_inner = OpFunction %v4float None %30
%32 = OpLabel
%33 = OpFunctionCall %void %atanh_f3e01b
%vertex_main_inner = OpFunction %v4float None %32
%34 = OpLabel
%35 = OpFunctionCall %void %atanh_f3e01b
OpReturnValue %5
OpFunctionEnd
%vertex_main = OpFunction %void None %21
%35 = OpLabel
%36 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %36
%37 = OpLabel
%38 = OpFunctionCall %v4float %vertex_main_inner
OpStore %value %38
OpStore %vertex_point_size %float_1
OpReturn
OpFunctionEnd
%fragment_main = OpFunction %void None %21
%38 = OpLabel
%39 = OpFunctionCall %void %atanh_f3e01b
%40 = OpLabel
%41 = OpFunctionCall %void %atanh_f3e01b
OpReturn
OpFunctionEnd
%compute_main = OpFunction %void None %21
%41 = OpLabel
%42 = OpFunctionCall %void %atanh_f3e01b
%43 = OpLabel
%44 = OpFunctionCall %void %atanh_f3e01b
OpReturn
OpFunctionEnd

View File

@ -1,5 +1,5 @@
fn atanh_f3e01b() {
var arg_0 = vec4<f32>(1.0f);
var arg_0 = vec4<f32>(0.5f);
var res : vec4<f32> = atanh(arg_0);
}

View File

@ -303,6 +303,7 @@ func (g *generator) bindAndParse(t *template.Template, text string) error {
"Title": strings.Title,
"PascalCase": pascalCase,
"SplitDisplayName": gen.SplitDisplayName,
"Contains": strings.Contains,
"HasPrefix": strings.HasPrefix,
"HasSuffix": strings.HasSuffix,
"TrimPrefix": strings.TrimPrefix,

View File

@ -367,7 +367,7 @@ func (l *Attributes) Take(name string) *Attribute {
type Attribute struct {
Source tok.Source
Name string
Values []string
Values []any
}
// Format implements the fmt.Formatter interface

View File

@ -83,9 +83,10 @@ func (p *Permuter) Permute(overload *sem.Overload) ([]Permutation, error) {
return nil
}
o.Parameters = append(o.Parameters, sem.Parameter{
Name: p.Name,
Type: ty,
IsConst: p.IsConst,
Name: p.Name,
Type: ty,
IsConst: p.IsConst,
TestValue: p.TestValue,
})
}
if overload.ReturnType != nil {

View File

@ -104,7 +104,23 @@ func (l *lexer) lex() error {
case unicode.IsLetter(l.peek(0)) || l.peek(0) == '_':
l.tok(l.count(alphaNumericOrUnderscore), tok.Identifier)
case unicode.IsNumber(l.peek(0)):
l.tok(l.count(unicode.IsNumber), tok.Integer)
isFloat := false
pred := func(r rune) bool {
if unicode.IsNumber(r) {
return true
}
if !isFloat && r == '.' {
isFloat = true
return true
}
return false
}
n := l.count(pred)
if isFloat {
l.tok(n, tok.Float)
} else {
l.tok(n, tok.Integer)
}
case l.match("&&", tok.AndAnd):
case l.match("&", tok.And):
case l.match("||", tok.OrOr):

View File

@ -20,12 +20,13 @@ import (
"dawn.googlesource.com/dawn/tools/src/tint/intrinsic/lexer"
"dawn.googlesource.com/dawn/tools/src/tint/intrinsic/tok"
"github.com/google/go-cmp/cmp"
)
func TestLexTokens(t *testing.T) {
type test struct {
src string
expect tok.Token
expect []tok.Token
}
filepath := "test.txt"
@ -34,144 +35,153 @@ func TestLexTokens(t *testing.T) {
}
for _, test := range []test{
{"ident", tok.Token{Kind: tok.Identifier, Runes: []rune("ident"), Source: tok.Source{
{"ident", []tok.Token{{Kind: tok.Identifier, Runes: []rune("ident"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 6, 5),
}}},
{"ident_123", tok.Token{Kind: tok.Identifier, Runes: []rune("ident_123"), Source: tok.Source{
}}}},
{"ident_123", []tok.Token{{Kind: tok.Identifier, Runes: []rune("ident_123"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 10, 9),
}}},
{"_ident_", tok.Token{Kind: tok.Identifier, Runes: []rune("_ident_"), Source: tok.Source{
}}}},
{"_ident_", []tok.Token{{Kind: tok.Identifier, Runes: []rune("_ident_"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 8, 7),
}}},
{"123456789", tok.Token{Kind: tok.Integer, Runes: []rune("123456789"), Source: tok.Source{
}}}},
{"123456789", []tok.Token{{Kind: tok.Integer, Runes: []rune("123456789"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 10, 9),
}}},
{"match", tok.Token{Kind: tok.Match, Runes: []rune("match"), Source: tok.Source{
}}}},
{"1234.56789", []tok.Token{{Kind: tok.Float, Runes: []rune("1234.56789"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 11, 10),
}}}},
{"123.456.789", []tok.Token{
{Kind: tok.Float, Runes: []rune("123.456"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 8, 7),
}},
{Kind: tok.Dot, Runes: []rune("."), Source: tok.Source{
S: loc(1, 8, 7), E: loc(1, 9, 8),
}},
{Kind: tok.Integer, Runes: []rune("789"), Source: tok.Source{
S: loc(1, 9, 8), E: loc(1, 12, 11),
}},
}},
{"match", []tok.Token{{Kind: tok.Match, Runes: []rune("match"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 6, 5),
}}},
{"fn", tok.Token{Kind: tok.Function, Runes: []rune("fn"), Source: tok.Source{
}}}},
{"fn", []tok.Token{{Kind: tok.Function, Runes: []rune("fn"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"op", tok.Token{Kind: tok.Operator, Runes: []rune("op"), Source: tok.Source{
}}}},
{"op", []tok.Token{{Kind: tok.Operator, Runes: []rune("op"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"type", tok.Token{Kind: tok.Type, Runes: []rune("type"), Source: tok.Source{
}}}},
{"type", []tok.Token{{Kind: tok.Type, Runes: []rune("type"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 5, 4),
}}},
{"init", tok.Token{Kind: tok.Initializer, Runes: []rune("init"), Source: tok.Source{
}}}},
{"init", []tok.Token{{Kind: tok.Initializer, Runes: []rune("init"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 5, 4),
}}},
{"conv", tok.Token{Kind: tok.Converter, Runes: []rune("conv"), Source: tok.Source{
}}}},
{"conv", []tok.Token{{Kind: tok.Converter, Runes: []rune("conv"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 5, 4),
}}},
{"enum", tok.Token{Kind: tok.Enum, Runes: []rune("enum"), Source: tok.Source{
}}}},
{"enum", []tok.Token{{Kind: tok.Enum, Runes: []rune("enum"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 5, 4),
}}},
{":", tok.Token{Kind: tok.Colon, Runes: []rune(":"), Source: tok.Source{
}}}},
{":", []tok.Token{{Kind: tok.Colon, Runes: []rune(":"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{",", tok.Token{Kind: tok.Comma, Runes: []rune(","), Source: tok.Source{
}}}},
{",", []tok.Token{{Kind: tok.Comma, Runes: []rune(","), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"<", tok.Token{Kind: tok.Lt, Runes: []rune("<"), Source: tok.Source{
}}}},
{"<", []tok.Token{{Kind: tok.Lt, Runes: []rune("<"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{">", tok.Token{Kind: tok.Gt, Runes: []rune(">"), Source: tok.Source{
}}}},
{">", []tok.Token{{Kind: tok.Gt, Runes: []rune(">"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"{", tok.Token{Kind: tok.Lbrace, Runes: []rune("{"), Source: tok.Source{
}}}},
{"{", []tok.Token{{Kind: tok.Lbrace, Runes: []rune("{"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"}", tok.Token{Kind: tok.Rbrace, Runes: []rune("}"), Source: tok.Source{
}}}},
{"}", []tok.Token{{Kind: tok.Rbrace, Runes: []rune("}"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"&&", tok.Token{Kind: tok.AndAnd, Runes: []rune("&&"), Source: tok.Source{
}}}},
{"&&", []tok.Token{{Kind: tok.AndAnd, Runes: []rune("&&"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"&", tok.Token{Kind: tok.And, Runes: []rune("&"), Source: tok.Source{
}}}},
{"&", []tok.Token{{Kind: tok.And, Runes: []rune("&"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"||", tok.Token{Kind: tok.OrOr, Runes: []rune("||"), Source: tok.Source{
}}}},
{"||", []tok.Token{{Kind: tok.OrOr, Runes: []rune("||"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"|", tok.Token{Kind: tok.Or, Runes: []rune("|"), Source: tok.Source{
}}}},
{"|", []tok.Token{{Kind: tok.Or, Runes: []rune("|"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"!", tok.Token{Kind: tok.Not, Runes: []rune("!"), Source: tok.Source{
}}}},
{"!", []tok.Token{{Kind: tok.Not, Runes: []rune("!"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"!=", tok.Token{Kind: tok.NotEqual, Runes: []rune("!="), Source: tok.Source{
}}}},
{"!=", []tok.Token{{Kind: tok.NotEqual, Runes: []rune("!="), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"==", tok.Token{Kind: tok.Equal, Runes: []rune("=="), Source: tok.Source{
}}}},
{"==", []tok.Token{{Kind: tok.Equal, Runes: []rune("=="), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"=", tok.Token{Kind: tok.Assign, Runes: []rune("="), Source: tok.Source{
}}}},
{"=", []tok.Token{{Kind: tok.Assign, Runes: []rune("="), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"<<", tok.Token{Kind: tok.Shl, Runes: []rune("<<"), Source: tok.Source{
}}}},
{"<<", []tok.Token{{Kind: tok.Shl, Runes: []rune("<<"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"<=", tok.Token{Kind: tok.Le, Runes: []rune("<="), Source: tok.Source{
}}}},
{"<=", []tok.Token{{Kind: tok.Le, Runes: []rune("<="), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"<", tok.Token{Kind: tok.Lt, Runes: []rune("<"), Source: tok.Source{
}}}},
{"<", []tok.Token{{Kind: tok.Lt, Runes: []rune("<"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{">=", tok.Token{Kind: tok.Ge, Runes: []rune(">="), Source: tok.Source{
}}}},
{">=", []tok.Token{{Kind: tok.Ge, Runes: []rune(">="), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{">>", tok.Token{Kind: tok.Shr, Runes: []rune(">>"), Source: tok.Source{
}}}},
{">>", []tok.Token{{Kind: tok.Shr, Runes: []rune(">>"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{">", tok.Token{Kind: tok.Gt, Runes: []rune(">"), Source: tok.Source{
}}}},
{">", []tok.Token{{Kind: tok.Gt, Runes: []rune(">"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"@", tok.Token{Kind: tok.Attr, Runes: []rune("@"), Source: tok.Source{
}}}},
{"@", []tok.Token{{Kind: tok.Attr, Runes: []rune("@"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"(", tok.Token{Kind: tok.Lparen, Runes: []rune("("), Source: tok.Source{
}}}},
{"(", []tok.Token{{Kind: tok.Lparen, Runes: []rune("("), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{")", tok.Token{Kind: tok.Rparen, Runes: []rune(")"), Source: tok.Source{
}}}},
{")", []tok.Token{{Kind: tok.Rparen, Runes: []rune(")"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"|", tok.Token{Kind: tok.Or, Runes: []rune("|"), Source: tok.Source{
}}}},
{"|", []tok.Token{{Kind: tok.Or, Runes: []rune("|"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"*", tok.Token{Kind: tok.Star, Runes: []rune("*"), Source: tok.Source{
}}}},
{"*", []tok.Token{{Kind: tok.Star, Runes: []rune("*"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{"->", tok.Token{Kind: tok.Arrow, Runes: []rune("->"), Source: tok.Source{
}}}},
{"->", []tok.Token{{Kind: tok.Arrow, Runes: []rune("->"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 3, 2),
}}},
{"x // y ", tok.Token{Kind: tok.Identifier, Runes: []rune("x"), Source: tok.Source{
}}}},
{"x // y ", []tok.Token{{Kind: tok.Identifier, Runes: []rune("x"), Source: tok.Source{
S: loc(1, 1, 0), E: loc(1, 2, 1),
}}},
{`"abc"`, tok.Token{Kind: tok.String, Runes: []rune("abc"), Source: tok.Source{
}}}},
{`"abc"`, []tok.Token{{Kind: tok.String, Runes: []rune("abc"), Source: tok.Source{
S: loc(1, 2, 1), E: loc(1, 5, 4),
}}},
}}}},
{`
//
ident
`, tok.Token{Kind: tok.Identifier, Runes: []rune("ident"), Source: tok.Source{
`, []tok.Token{{Kind: tok.Identifier, Runes: []rune("ident"), Source: tok.Source{
S: loc(3, 4, 10), E: loc(3, 9, 15),
}}},
}}}},
} {
got, err := lexer.Lex([]rune(test.src), filepath)
name := fmt.Sprintf(`Lex("%v")`, test.src)
switch {
case err != nil:
if err != nil {
t.Errorf("%v returned error: %v", name, err)
case len(got) != 1:
t.Errorf("%v returned %d tokens: %v", name, len(got), got)
case got[0].Kind != test.expect.Kind:
t.Errorf(`%v returned unexpected token kind: got "%+v", expected "%+v"`, name, got[0], test.expect)
case string(got[0].Runes) != string(test.expect.Runes):
t.Errorf(`%v returned unexpected token runes: got "%+v", expected "%+v"`, name, string(got[0].Runes), string(test.expect.Runes))
case got[0].Source != test.expect.Source:
t.Errorf(`%v returned unexpected token source: got %+v, expected %+v`, name, got[0].Source, test.expect.Source)
continue
}
if diff := cmp.Diff(got, test.expect); diff != "" {
t.Errorf(`%v: %v`, name, diff)
}
}
}

View File

@ -18,6 +18,7 @@ package parser
import (
"fmt"
"strconv"
"dawn.googlesource.com/dawn/tools/src/tint/intrinsic/ast"
"dawn.googlesource.com/dawn/tools/src/tint/intrinsic/lexer"
@ -145,10 +146,26 @@ func (p *parser) attributes() ast.Attributes {
var out ast.Attributes
for p.match(tok.Attr) != nil && p.err == nil {
name := p.expect(tok.Identifier, "attribute name")
values := []string{}
var values []any
if p.match(tok.Lparen) != nil {
loop:
for p.err == nil {
values = append(values, string(p.next().Runes))
t := p.next()
switch t.Kind {
case tok.Rparen:
break loop
case tok.String:
values = append(values, string(t.Runes))
case tok.Integer:
i, _ := strconv.ParseInt(string(t.Runes), 10, 64)
values = append(values, int(i))
case tok.Float:
f, _ := strconv.ParseFloat(string(t.Runes), 64)
values = append(values, f)
default:
p.err = fmt.Errorf("%v invalid attribute value kind: %v", t.Source, t.Kind)
return nil
}
if p.match(tok.Comma) == nil {
break
}

View File

@ -52,7 +52,7 @@ func TestParser(t *testing.T) {
{
Attributes: ast.Attributes{{
Name: "attr",
Values: []string{},
Values: nil,
}},
Name: "B",
},
@ -85,7 +85,7 @@ func TestParser(t *testing.T) {
ast.AST{
Types: []ast.TypeDecl{{
Attributes: ast.Attributes{
{Name: "attr", Values: []string{}},
{Name: "attr", Values: nil},
},
Name: "T",
}},
@ -96,8 +96,8 @@ func TestParser(t *testing.T) {
ast.AST{
Types: []ast.TypeDecl{{
Attributes: ast.Attributes{
{Name: "attr_a", Values: []string{}},
{Name: "attr_b", Values: []string{}},
{Name: "attr_a", Values: nil},
{Name: "attr_b", Values: nil},
},
Name: "T",
}},
@ -107,17 +107,17 @@ func TestParser(t *testing.T) {
`@attr("a", "b") type T`, ast.AST{
Types: []ast.TypeDecl{{
Attributes: ast.Attributes{
{Name: "attr", Values: []string{"a", "b"}},
{Name: "attr", Values: []any{"a", "b"}},
},
Name: "T",
}},
},
}, { ///////////////////////////////////////////////////////////////////
utils.ThisLine(),
`@attr(1, "x") type T`, ast.AST{
`@attr(1, "x", 2.0) type T`, ast.AST{
Types: []ast.TypeDecl{{
Attributes: ast.Attributes{
{Name: "attr", Values: []string{"1", "x"}},
{Name: "attr", Values: []any{1, "x", 2.0}},
},
Name: "T",
}},
@ -194,7 +194,7 @@ func TestParser(t *testing.T) {
Kind: ast.Builtin,
Name: "F",
Attributes: ast.Attributes{
{Name: "attr", Values: []string{}},
{Name: "attr", Values: nil},
},
Parameters: ast.Parameters{},
}},
@ -318,7 +318,7 @@ func TestParser(t *testing.T) {
Kind: ast.Operator,
Name: "F",
Attributes: ast.Attributes{
{Name: "attr", Values: []string{}},
{Name: "attr", Values: nil},
},
Parameters: ast.Parameters{},
}},
@ -344,7 +344,7 @@ func TestParser(t *testing.T) {
Name: "F",
Parameters: ast.Parameters{
{
Attributes: ast.Attributes{{Name: "blah", Values: []string{}}},
Attributes: ast.Attributes{{Name: "blah", Values: nil}},
Type: ast.TemplatedName{Name: "a"}},
},
}},
@ -456,7 +456,7 @@ func TestParser(t *testing.T) {
Kind: ast.Initializer,
Name: "F",
Attributes: ast.Attributes{
{Name: "attr", Values: []string{}},
{Name: "attr", Values: nil},
},
Parameters: ast.Parameters{},
}},
@ -580,7 +580,7 @@ func TestParser(t *testing.T) {
Kind: ast.Converter,
Name: "F",
Attributes: ast.Attributes{
{Name: "attr", Values: []string{}},
{Name: "attr", Values: nil},
},
Parameters: ast.Parameters{},
}},

View File

@ -17,7 +17,6 @@ package resolver
import (
"fmt"
"sort"
"strconv"
"dawn.googlesource.com/dawn/tools/src/container"
"dawn.googlesource.com/dawn/tools/src/tint/intrinsic/ast"
@ -184,15 +183,15 @@ func (r *resolver) ty(a ast.TypeDecl) error {
if len(d.Values) != 1 {
return fmt.Errorf("%v expected a single value for 'display' attribute", d.Source)
}
t.DisplayName = d.Values[0]
t.DisplayName = fmt.Sprint(d.Values[0])
}
if d := a.Attributes.Take("precedence"); d != nil {
if len(d.Values) != 1 {
return fmt.Errorf("%v expected a single integer value for 'precedence' attribute", d.Source)
}
n, err := strconv.Atoi(d.Values[0])
if err != nil {
return fmt.Errorf("%v %v", d.Source, err)
n, ok := d.Values[0].(int)
if !ok {
return fmt.Errorf("%v @precedence value must be an integer", d.Source)
}
t.Precedence = n
}
@ -358,7 +357,11 @@ func (r *resolver) intrinsic(
overload.ConstEvalFunction = "Conv"
}
case 1:
overload.ConstEvalFunction = constEvalFn.Values[0]
fn, ok := constEvalFn.Values[0].(string)
if !ok {
return fmt.Errorf("%v optional @const value must be a string", constEvalFn.Source)
}
overload.ConstEvalFunction = fn
default:
return fmt.Errorf("%v too many values for @const attribute", constEvalFn.Source)
}
@ -405,13 +408,25 @@ func (r *resolver) intrinsic(
if attribute := p.Attributes.Take("const"); attribute != nil {
isConst = true
}
testValue := 1.0
if attribute := p.Attributes.Take("test_value"); attribute != nil {
switch v := attribute.Values[0].(type) {
case int:
testValue = float64(v)
case float64:
testValue = v
default:
return fmt.Errorf("%v @test_value must be an integer or float", p.Attributes[0].Source)
}
}
if len(p.Attributes) != 0 {
return fmt.Errorf("%v unknown attribute", p.Attributes[0].Source)
}
overload.Parameters[i] = sem.Parameter{
Name: p.Name,
Type: usage,
IsConst: isConst,
Name: p.Name,
Type: usage,
IsConst: isConst,
TestValue: testValue,
}
}

View File

@ -242,9 +242,10 @@ func (o Overload) Format(w fmt.State, verb rune) {
// Parameter describes a single parameter of a function overload
type Parameter struct {
Name string
Type FullyQualifiedName
IsConst bool // Did this parameter have a @const attribute?
Name string
Type FullyQualifiedName
IsConst bool // Did this parameter have a @const attribute?
TestValue float64 // Value to use for end-to-end tests
}
// Format implements the fmt.Formatter interface

View File

@ -26,6 +26,7 @@ const (
InvalidToken Kind = "<invalid>"
Identifier Kind = "ident"
Integer Kind = "integer"
Float Kind = "float"
String Kind = "string"
Match Kind = "match"
Function Kind = "fn"