xref: /llvm-project/clang/test/SemaHLSL/prohibit_pointer.hlsl (revision 8a27a2f89f83c55d352c001b3b308c35900cbdfc)
1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -o - -fsyntax-only %s -verify
2
3// expected-error@+1 {{pointers are unsupported in HLSL}}
4typedef int (*fn_int)(int);
5void* bark(int); // expected-error {{pointers are unsupported in HLSL}}
6void meow(int*); // expected-error {{pointers are unsupported in HLSL}}
7
8struct Foo {
9  int X;
10  int Y;
11} *bad; // expected-error {{pointers are unsupported in HLSL}}
12
13// expected-error@+1 {{pointers are unsupported in HLSL}}
14void woof(int Foo::*Member);
15
16int entry() {
17  int X;
18  Foo F;
19
20  // expected-error@+2 {{the '&' operator is unsupported in HLSL}}
21  // expected-error@+1 {{pointers are unsupported in HLSL}}
22  int Foo::*Member = &F.X;
23
24
25  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
26  int *Y = &X; // expected-error {{pointers are unsupported in HLSL}}
27
28  // expected-error@+2 {{the '->' operator is unsupported in HLSL}}
29  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
30  int W = (&F)->X;
31
32  int Array[2];
33  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
34  *(&Array[0] + 1) = 12;
35  // expected-error@+1 {{the '*' operator is unsupported in HLSL}}
36  *Array = 12;
37}
38
39int roar(Foo *F) { // expected-error {{pointers are unsupported in HLSL}}
40  // expected-error@+1 {{the '->' operator is unsupported in HLSL}}
41  return F->X;
42}
43
44template <typename T>
45void devilish_language(T look_ma_no_pointers);
46
47void make_me_cry() {
48  int X;
49  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
50  devilish_language(&X);
51
52  // not-expected-error@+1 {{pointers are unsupported in HLSL}}
53  devilish_language(roar); // allow function pointer decay
54
55  // not-expected-error@+1 {{pointers are unsupported in HLSL}}
56  devilish_language("roar"); // allow array pointer decay
57}
58
59struct Fish {
60  struct Fins {
61    int Left;
62    int Right;
63  };
64  int X;
65  int operator *() {
66    return X;
67  }
68
69  // expected-note@+1 {{'->' applied to return value of the operator->() declared here}}
70  Fins operator ->() {
71    return Fins();
72  }
73};
74
75int gone_fishing() {
76  Fish F;
77  int Result = *F; // user-defined dereference operators work
78  // expected-error@+1 {{member reference type 'Fins' is not a pointer}}
79  Result += F->Left;
80  return Result;
81}
82