struct A {
  int f_a;
};

struct B {
  double f_a;
  float f_b;
};

enum E {
  Zero,
  One,
  Two,
  Three
};

enum class ScopedE {
  Zero,
  One,
  Two,
  Three
};

void IRTypes() {
  char c;  // $ irtype=int1
  signed char sc;  // $ irtype=int1
  unsigned char uc;  // $ irtype=uint1
  short s;  // $ irtype=int2
  signed short ss;  // $ irtype=int2
  unsigned short us;  // $ irtype=uint2
  int i;  // $ irtype=int4
  signed int si;  // $ irtype=int4
  unsigned int ui;  // $ irtype=uint4
  long l;  // $ irtype=int8
  signed long sl;  // $ irtype=int8
  unsigned long ul;  // $ irtype=uint8
  long long ll;  // $ irtype=int8
  signed long long sll;  // $ irtype=int8
  unsigned long long ull;  // $ irtype=uint8
  bool b;  // $ irtype=bool1
  float f;  // $ irtype=float4
  double d;  // $ irtype=float8
  long double ld;  // $ irtype=float16
  __float128 f128;  // $ irtype=float16

  wchar_t wc;  // $ irtype=uint4
//  char8_t c8;  // $ irtype=uint1
  char16_t c16;  // $ irtype=uint2
  char32_t c32;  // $ irtype=uint4

  int* pi;  // $ irtype=addr8
  int& ri = i;  // $ irtype=addr8
  void (*pfn)() = nullptr;  // $ irtype=func8
  void (&rfn)() = IRTypes;  // $ irtype=func8

  A s_a;  // $ irtype=opaque4{A}
  B s_b;  // $ irtype=opaque16{B}

  E e;  // $ irtype=uint4
  ScopedE se;  // $ irtype=uint4

  B a_b[10];  // $ irtype=opaque160{B[10]}
}

// semmle-extractor-options: -std=c++17 --clang
