[clang] Implement lifetime analysis for lifetime_capture_by(X) (#115921)
[llvm-project.git] / clang / test / SemaHLSL / prohibit_pointer.hlsl
blob76c017150f9d556cba84be4d3cf01b05687e12d1
1 // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-library -x hlsl -o - -fsyntax-only %s -verify
3 // expected-error@+1 {{pointers are unsupported in HLSL}}
4 typedef int (*fn_int)(int);
5 void* bark(int); // expected-error {{pointers are unsupported in HLSL}}
6 void meow(int*); // expected-error {{pointers are unsupported in HLSL}}
8 struct Foo {
9   int X;
10   int Y;
11 } *bad; // expected-error {{pointers are unsupported in HLSL}}
13 // expected-error@+1 {{pointers are unsupported in HLSL}}
14 void woof(int Foo::*Member);
16 int 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;
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;
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;
39 int roar(Foo *F) { // expected-error {{pointers are unsupported in HLSL}}
40   // expected-error@+1 {{the '->' operator is unsupported in HLSL}}
41   return F->X;
44 template <typename T>
45 void devilish_language(T look_ma_no_pointers);
47 void make_me_cry() {
48   int X;
49   // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
50   devilish_language(&X);
52   // not-expected-error@+1 {{pointers are unsupported in HLSL}}
53   devilish_language(roar); // allow function pointer decay
55   // not-expected-error@+1 {{pointers are unsupported in HLSL}}
56   devilish_language("roar"); // allow array pointer decay
59 struct Fish {
60   struct Fins {
61     int Left;
62     int Right;
63   };
64   int X;
65   int operator *() {
66     return X;
67   }
69   // expected-note@+1 {{'->' applied to return value of the operator->() declared here}}
70   Fins operator ->() {
71     return Fins();
72   }
75 int 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;