File: prohibit_pointer.hlsl

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (81 lines) | stat: -rw-r--r-- 2,258 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.0-compute -x hlsl -o - -fsyntax-only %s -verify

// expected-error@+1 {{pointers are unsupported in HLSL}}
typedef int (*fn_int)(int);
void* bark(int); // expected-error {{pointers are unsupported in HLSL}}
void meow(int*); // expected-error {{pointers are unsupported in HLSL}}

struct Foo {
  int X;
  int Y;
} *bad; // expected-error {{pointers are unsupported in HLSL}}

// expected-error@+1 {{pointers are unsupported in HLSL}}
void woof(int Foo::*Member);

int entry() {
  int X;
  Foo F;
  
  // expected-error@+2 {{the '&' operator is unsupported in HLSL}}
  // expected-error@+1 {{pointers are unsupported in HLSL}}
  int Foo::*Member = &F.X;

  
  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
  int *Y = &X; // expected-error {{pointers are unsupported in HLSL}}
  
  // expected-error@+2 {{the '->' operator is unsupported in HLSL}}
  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
  int W = (&F)->X;

  int Array[2];
  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
  *(&Array[0] + 1) = 12;
  // expected-error@+1 {{the '*' operator is unsupported in HLSL}}
  *Array = 12;
}

int roar(Foo *F) { // expected-error {{pointers are unsupported in HLSL}}
  // expected-error@+1 {{the '->' operator is unsupported in HLSL}}
  return F->X;
}

template <typename T>
void devilish_language(T look_ma_no_pointers);

void make_me_cry() {
  int X;
  // expected-error@+1 {{the '&' operator is unsupported in HLSL}}
  devilish_language(&X);

  // not-expected-error@+1 {{pointers are unsupported in HLSL}}
  devilish_language(roar); // allow function pointer decay

  // not-expected-error@+1 {{pointers are unsupported in HLSL}}
  devilish_language("roar"); // allow array pointer decay
}

struct Fish {
  struct Fins {
    int Left;
    int Right;
  };
  int X;
  int operator *() {
    return X;
  }

  // expected-note@+1 {{'->' applied to return value of the operator->() declared here}}
  Fins operator ->() {
    return Fins();
  }
};

int gone_fishing() {
  Fish F;
  int Result = *F; // user-defined dereference operators work
  // expected-error@+1 {{member reference type 'Fish::Fins' is not a pointer}}
  Result += F->Left;
  return Result;
}