File: prohibit_pointer.hlsl

package info (click to toggle)
llvm-toolchain-19 1%3A19.1.7-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,998,520 kB
  • sloc: cpp: 6,951,680; ansic: 1,486,157; asm: 913,598; python: 232,024; f90: 80,126; objc: 75,281; lisp: 37,276; pascal: 16,990; sh: 10,009; ml: 5,058; perl: 4,724; awk: 3,523; makefile: 3,167; javascript: 2,504; xml: 892; fortran: 664; cs: 573
file content (81 lines) | stat: -rw-r--r-- 2,252 bytes parent folder | download | duplicates (12)
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-library -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 'Fins' is not a pointer}}
  Result += F->Left;
  return Result;
}