// File: dsharlet[P]array/test/array_ref.cpp
// Function: nda::test_array_ref_implicit_conversion_body()
TEST(array_ref_implicit_conversion) {
  array_ref_of_rank<int, 3> null_ref(nullptr, {10, 20, 30});
  array_of_rank<int, 3> non_ref({5, 10, 20});
  dense_array<int, 3> dense_non_ref({5, 10, 20});
  const array_of_rank<int, 3>& const_non_ref = non_ref;

  // array -> ref
  array_ref_of_rank<int, 3> ref(non_ref);
  array_ref_of_rank<const int, 3> const_ref(const_non_ref);
  ref = non_ref;
  const_ref = non_ref;
  const_ref = const_non_ref;

  // non-const -> const
  array_ref_of_rank<const int, 3> const_null_ref(null_ref);
  const_null_ref = null_ref;
  const_ref = non_ref;
  non_template_const(null_ref);
  non_template_const(non_ref);

  // arbitrary -> dense
  dense_array_ref<int, 3> dense_null_ref(null_ref);
  dense_null_ref = null_ref;
  non_template_dense(null_ref);
  // non_template_dense(non_ref);

  // dense -> general
  array_ref_of_rank<int, 3> null_ref2(dense_null_ref);
  null_ref = dense_null_ref;
  non_template(dense_null_ref);
  // non_template(dense_non_ref);

  // nullptr -> ref
  non_template(nullptr);
  non_template_const(nullptr);
  non_template_dense(nullptr);

  ASSERT_EQ(overload_shape(null_ref), general);
  ASSERT_EQ(overload_shape(dense_null_ref), dense);
  ASSERT_EQ(overload_shape_const(null_ref), general);
  ASSERT_EQ(overload_shape_const(dense_null_ref), dense);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x11d0, %rsp           # imm = 0x11D0
leaq -0x98(%rbp), %rdi
movq %rdi, -0x1090(%rbp)
movl $0xa, %esi
movl %esi, -0x107c(%rbp)
movl $0x14, %edx
movl %edx, -0x1078(%rbp)
movl $0x1e, %ecx
callq 0x34ec0
movq -0x1090(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
leaq -0x50(%rbp), %rdi
callq 0x97160
movl -0x107c(%rbp), %edx
movl -0x1078(%rbp), %ecx
leaq -0x148(%rbp), %rdi
movq %rdi, -0x1088(%rbp)
movl $0x5, %esi
movl %esi, -0x1080(%rbp)
callq 0x34ec0
movq -0x1088(%rbp), %rsi
leaq -0x100(%rbp), %rdi
callq 0x34f10
movl -0x1080(%rbp), %esi
movl -0x107c(%rbp), %edx
movl -0x1078(%rbp), %ecx
leaq -0x1f8(%rbp), %rdi
callq 0x34640
jmp 0x8fb0a
leaq -0x1b0(%rbp), %rdi
leaq -0x1f8(%rbp), %rsi
callq 0x10d10
jmp 0x8fb1f
leaq -0x100(%rbp), %rsi
movq %rsi, -0x210(%rbp)
leaq -0x260(%rbp), %rdi
callq 0x971b0
jmp 0x8fb3b
movq -0x210(%rbp), %rsi
leaq -0x2b0(%rbp), %rdi
callq 0x971e0
jmp 0x8fb50
leaq -0x300(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x971b0
jmp 0x8fb65
leaq -0x260(%rbp), %rdi
leaq -0x300(%rbp), %rsi
callq 0x97210
leaq -0x350(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x971e0
jmp 0x8fb8d
leaq -0x2b0(%rbp), %rdi
leaq -0x350(%rbp), %rsi
callq 0x97250
movq -0x210(%rbp), %rsi
leaq -0x3a0(%rbp), %rdi
callq 0x971e0
jmp 0x8fbb5
leaq -0x2b0(%rbp), %rdi
leaq -0x3a0(%rbp), %rsi
callq 0x97250
leaq -0x3f0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x97290
jmp 0x8fbda
leaq -0x440(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x97290
jmp 0x8fbec
leaq -0x3f0(%rbp), %rdi
leaq -0x440(%rbp), %rsi
callq 0x97250
leaq -0x490(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x971e0
jmp 0x8fc14
leaq -0x2b0(%rbp), %rdi
leaq -0x490(%rbp), %rsi
callq 0x97250
leaq -0x4e0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x97290
jmp 0x8fc39
leaq -0x4e0(%rbp), %rdi
callq 0x8fa00
leaq -0x530(%rbp), %rdi
leaq -0x100(%rbp), %rsi
callq 0x971e0
jmp 0x8fc5a
leaq -0x530(%rbp), %rdi
callq 0x8fa00
leaq -0x580(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x972c0
jmp 0x8fc78
leaq -0x580(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x97320
jmp 0x8fc8a
leaq -0x5d0(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x972c0
jmp 0x8fc9c
leaq -0x5d0(%rbp), %rdi
callq 0x8fa10
leaq -0x620(%rbp), %rdi
leaq -0x580(%rbp), %rsi
callq 0x97370
jmp 0x8fcbd
leaq -0x50(%rbp), %rdi
leaq -0x580(%rbp), %rsi
callq 0x973d0
jmp 0x8fccf
leaq -0x670(%rbp), %rdi
leaq -0x580(%rbp), %rsi
callq 0x97370
jmp 0x8fce4
leaq -0x670(%rbp), %rdi
callq 0x8f9f0
leaq -0x708(%rbp), %rdi
callq 0x398b0
jmp 0x8fcfe
xorl %eax, %eax
movl %eax, %esi
leaq -0x6c0(%rbp), %rdi
leaq -0x708(%rbp), %rdx
callq 0x97160
jmp 0x8fd17
leaq -0x6c0(%rbp), %rdi
callq 0x8f9f0
leaq -0x7a0(%rbp), %rdi
callq 0x398b0
jmp 0x8fd31
xorl %eax, %eax
movl %eax, %esi
leaq -0x758(%rbp), %rdi
leaq -0x7a0(%rbp), %rdx
callq 0x97420
jmp 0x8fd4a
leaq -0x758(%rbp), %rdi
callq 0x8fa00
leaq -0x838(%rbp), %rdi
callq 0x16440
jmp 0x8fd64
xorl %eax, %eax
movl %eax, %esi
leaq -0x7f0(%rbp), %rdi
leaq -0x838(%rbp), %rdx
callq 0x97470
jmp 0x8fd7d
leaq -0x7f0(%rbp), %rdi
callq 0x8fa10
leaq -0x50(%rbp), %rdi
callq 0x8fa20
testl %eax, %eax
sete %al
movb %al, -0x1099(%rbp)
leaq -0x9e9(%rbp), %rdi
movq %rdi, -0x1098(%rbp)
callq 0x33b0
movq -0x1098(%rbp), %rdx
leaq 0x157e06(%rip), %rsi    # 0x1e7bc4
leaq -0x9e8(%rbp), %rdi
callq 0x10a90
jmp 0x8fdcc
movb -0x1099(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0x9c8(%rbp), %rdi
leaq -0x9e8(%rbp), %rdx
callq 0x10f80
jmp 0x8fded
leaq 0x14c9f1(%rip), %rsi    # 0x1dc7e5
leaq -0x9c8(%rbp), %rdi
callq 0x34320
movq %rax, -0x10a8(%rbp)
jmp 0x8fe09
movq -0x10a8(%rbp), %rdi
leaq 0x157dd1(%rip), %rsi    # 0x1e7be8
callq 0x86430
movq %rax, -0x10b0(%rbp)
jmp 0x8fe25
movq -0x10b0(%rbp), %rdi
leaq 0x150979(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x10b8(%rbp)
jmp 0x8fe41
leaq -0x50(%rbp), %rdi
callq 0x8fa20
movq -0x10b8(%rbp), %rdi
movl %eax, -0x9f0(%rbp)
leaq -0x9f0(%rbp), %rsi
callq 0x343a0
movq %rax, -0x10c0(%rbp)
jmp 0x8fe6c
movq -0x10c0(%rbp), %rdi
leaq 0x14c96b(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x10c8(%rbp)
jmp 0x8fe88
movq -0x10c8(%rbp), %rdi
leaq 0x157d4a(%rip), %rsi    # 0x1e7be0
callq 0x34600
movq %rax, -0x10d0(%rbp)
jmp 0x8fea4
movq -0x10d0(%rbp), %rdi
leaq 0x1508fa(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x10d8(%rbp)
jmp 0x8fec0
movq -0x10d8(%rbp), %rdi
movl $0x0, -0x9f4(%rbp)
leaq -0x9f4(%rbp), %rsi
callq 0x90660
movq %rax, -0x10e0(%rbp)
jmp 0x8fee6
movq -0x10e0(%rbp), %rdi
leaq 0x166587(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x8fefb
leaq -0x9c8(%rbp), %rdi
callq 0x10ff0
jmp 0x8ff09
leaq -0x9e8(%rbp), %rdi
callq 0x3100
leaq -0x9e9(%rbp), %rdi
callq 0x3290
leaq -0x580(%rbp), %rdi
callq 0x8fa30
subl $0x1, %eax
sete %al
movb %al, -0x10e9(%rbp)
leaq -0xba9(%rbp), %rdi
movq %rdi, -0x10e8(%rbp)
callq 0x33b0
movq -0x10e8(%rbp), %rdx
leaq 0x157ca7(%rip), %rsi    # 0x1e7c01
leaq -0xba8(%rbp), %rdi
callq 0x10a90
jmp 0x8ff68
movb -0x10e9(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0xb88(%rbp), %rdi
leaq -0xba8(%rbp), %rdx
callq 0x10f80
jmp 0x8ff89
leaq 0x14c855(%rip), %rsi    # 0x1dc7e5
leaq -0xb88(%rbp), %rdi
callq 0x34320
movq %rax, -0x10f8(%rbp)
jmp 0x8ffa5
movq -0x10f8(%rbp), %rdi
leaq 0x157c76(%rip), %rsi    # 0x1e7c29
callq 0x7f760
movq %rax, -0x1100(%rbp)
jmp 0x8ffc1
movq -0x1100(%rbp), %rdi
leaq 0x1507dd(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x1108(%rbp)
jmp 0x8ffdd
leaq -0x580(%rbp), %rdi
callq 0x8fa30
movq -0x1108(%rbp), %rdi
movl %eax, -0xbb0(%rbp)
leaq -0xbb0(%rbp), %rsi
callq 0x343a0
movq %rax, -0x1110(%rbp)
jmp 0x9000b
movq -0x1110(%rbp), %rdi
leaq 0x14c7cc(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x1118(%rbp)
jmp 0x90027
movq -0x1118(%rbp), %rdi
leaq 0x157bee(%rip), %rsi    # 0x1e7c23
callq 0x661c0
movq %rax, -0x1120(%rbp)
jmp 0x90043
movq -0x1120(%rbp), %rdi
leaq 0x15075b(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x1128(%rbp)
jmp 0x9005f
movq -0x1128(%rbp), %rdi
movl $0x1, -0xbb4(%rbp)
leaq -0xbb4(%rbp), %rsi
callq 0x90660
movq %rax, -0x1130(%rbp)
jmp 0x90085
movq -0x1130(%rbp), %rdi
leaq 0x1663e8(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x9009a
leaq -0xb88(%rbp), %rdi
callq 0x10ff0
jmp 0x900a8
leaq -0xba8(%rbp), %rdi
callq 0x3100
leaq -0xba9(%rbp), %rdi
callq 0x3290
leaq -0xd98(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x97290
jmp 0x900d2
leaq -0xd98(%rbp), %rdi
callq 0x8fa40
testl %eax, %eax
sete %al
movb %al, -0x1139(%rbp)
leaq -0xdb9(%rbp), %rdi
movq %rdi, -0x1138(%rbp)
callq 0x33b0
movq -0x1138(%rbp), %rdx
leaq 0x157b3e(%rip), %rsi    # 0x1e7c48
leaq -0xdb8(%rbp), %rdi
callq 0x10a90
jmp 0x90118
movb -0x1139(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0xd48(%rbp), %rdi
leaq -0xdb8(%rbp), %rdx
callq 0x10f80
jmp 0x90139
leaq 0x14c6a5(%rip), %rsi    # 0x1dc7e5
leaq -0xd48(%rbp), %rdi
callq 0x34320
movq %rax, -0x1148(%rbp)
jmp 0x90155
movq -0x1148(%rbp), %rdi
leaq 0x157b0f(%rip), %rsi    # 0x1e7c72
callq 0x7f760
movq %rax, -0x1150(%rbp)
jmp 0x90171
movq -0x1150(%rbp), %rdi
leaq 0x15062d(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x1158(%rbp)
jmp 0x9018d
leaq -0xe10(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x97290
jmp 0x9019f
leaq -0xe10(%rbp), %rdi
callq 0x8fa40
movq -0x1158(%rbp), %rdi
movl %eax, -0xdc0(%rbp)
leaq -0xdc0(%rbp), %rsi
callq 0x343a0
movq %rax, -0x1160(%rbp)
jmp 0x901cd
movq -0x1160(%rbp), %rdi
leaq 0x14c60a(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x1168(%rbp)
jmp 0x901e9
movq -0x1168(%rbp), %rdi
leaq 0x1579e9(%rip), %rsi    # 0x1e7be0
callq 0x34600
movq %rax, -0x1170(%rbp)
jmp 0x90205
movq -0x1170(%rbp), %rdi
leaq 0x150599(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x1178(%rbp)
jmp 0x90221
movq -0x1178(%rbp), %rdi
movl $0x0, -0xe14(%rbp)
leaq -0xe14(%rbp), %rsi
callq 0x90660
movq %rax, -0x1180(%rbp)
jmp 0x90247
movq -0x1180(%rbp), %rdi
leaq 0x166226(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x9025c
leaq -0xd48(%rbp), %rdi
callq 0x10ff0
jmp 0x9026a
leaq -0xdb8(%rbp), %rdi
callq 0x3100
leaq -0xdb9(%rbp), %rdi
callq 0x3290
leaq -0xff8(%rbp), %rdi
leaq -0x580(%rbp), %rsi
callq 0x974c0
jmp 0x90297
leaq -0xff8(%rbp), %rdi
callq 0x8fa50
subl $0x1, %eax
sete %al
movb %al, -0x1189(%rbp)
leaq -0x1019(%rbp), %rdi
movq %rdi, -0x1188(%rbp)
callq 0x33b0
movq -0x1188(%rbp), %rdx
leaq 0x1579c1(%rip), %rsi    # 0x1e7c91
leaq -0x1018(%rbp), %rdi
callq 0x10a90
jmp 0x902de
movb -0x1189(%rbp), %al
movzbl %al, %esi
andl $0x1, %esi
leaq -0xfa8(%rbp), %rdi
leaq -0x1018(%rbp), %rdx
callq 0x10f80
jmp 0x902ff
leaq 0x14c4df(%rip), %rsi    # 0x1dc7e5
leaq -0xfa8(%rbp), %rdi
callq 0x34320
movq %rax, -0x1198(%rbp)
jmp 0x9031b
movq -0x1198(%rbp), %rdi
leaq 0x157996(%rip), %rsi    # 0x1e7cbf
callq 0x7f8b0
movq %rax, -0x11a0(%rbp)
jmp 0x90337
movq -0x11a0(%rbp), %rdi
leaq 0x150467(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x11a8(%rbp)
jmp 0x90353
leaq -0x1070(%rbp), %rdi
leaq -0x580(%rbp), %rsi
callq 0x974c0
jmp 0x90368
leaq -0x1070(%rbp), %rdi
callq 0x8fa50
movq -0x11a8(%rbp), %rdi
movl %eax, -0x1020(%rbp)
leaq -0x1020(%rbp), %rsi
callq 0x343a0
movq %rax, -0x11b0(%rbp)
jmp 0x90396
movq -0x11b0(%rbp), %rdi
leaq 0x14c441(%rip), %rsi    # 0x1dc7e5
callq 0x34320
movq %rax, -0x11b8(%rbp)
jmp 0x903b2
movq -0x11b8(%rbp), %rdi
leaq 0x157863(%rip), %rsi    # 0x1e7c23
callq 0x661c0
movq %rax, -0x11c0(%rbp)
jmp 0x903ce
movq -0x11c0(%rbp), %rdi
leaq 0x1503d0(%rip), %rsi    # 0x1e07ac
callq 0x34320
movq %rax, -0x11c8(%rbp)
jmp 0x903ea
movq -0x11c8(%rbp), %rdi
movl $0x1, -0x1074(%rbp)
leaq -0x1074(%rbp), %rsi
callq 0x90660
movq %rax, -0x11d0(%rbp)
jmp 0x90410
movq -0x11d0(%rbp), %rdi
leaq 0x16605d(%rip), %rsi    # 0x1f647b
callq 0x34320
jmp 0x90425
leaq -0xfa8(%rbp), %rdi
callq 0x10ff0
jmp 0x90433
leaq -0x1018(%rbp), %rdi
callq 0x3100
leaq -0x1019(%rbp), %rdi
callq 0x3290
leaq -0x1b0(%rbp), %rdi
callq 0x11110
leaq -0x100(%rbp), %rdi
callq 0x35160
addq $0x11d0, %rsp           # imm = 0x11D0
popq %rbp
retq
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x9063a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x9062e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x904f0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x904e4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
leaq -0x9c8(%rbp), %rdi
callq 0x10ff0
jmp 0x904e2
jmp 0x904e4
leaq -0x9e8(%rbp), %rdi
callq 0x3100
leaq -0x9e9(%rbp), %rdi
callq 0x3290
jmp 0x9062e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x90557
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x9054b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
leaq -0xb88(%rbp), %rdi
callq 0x10ff0
jmp 0x90549
jmp 0x9054b
leaq -0xba8(%rbp), %rdi
callq 0x3100
leaq -0xba9(%rbp), %rdi
callq 0x3290
jmp 0x9062e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x905be
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x905b2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
leaq -0xd48(%rbp), %rdi
callq 0x10ff0
jmp 0x905b0
jmp 0x905b2
leaq -0xdb8(%rbp), %rdi
callq 0x3100
leaq -0xdb9(%rbp), %rdi
callq 0x3290
jmp 0x9062e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x90622
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
jmp 0x90616
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x200(%rbp)
movl %eax, -0x204(%rbp)
leaq -0xfa8(%rbp), %rdi
callq 0x10ff0
jmp 0x90614
jmp 0x90616
leaq -0x1018(%rbp), %rdi
callq 0x3100
leaq -0x1019(%rbp), %rdi
callq 0x3290
leaq -0x1b0(%rbp), %rdi
callq 0x11110
leaq -0x100(%rbp), %rdi
callq 0x35160
movq -0x200(%rbp), %rdi
callq 0x33a0
movq %rax, %rdi
callq 0x116d0
nopw (%rax,%rax)