#include "typeinfo.h"

int test1() {
	int x;
	return sizeof(x); // unevaluated
}

int test2() {
	int x;
	return sizeof(x + 1); // unevaluated
}

class MyClass {
public:
	int field;
};

void test3() {
	MyClass my_class;
	int x;
	decltype(my_class.field) y = x; // unevaluated
}

void test4() {
	int x;
	noexcept(x); // unevaluated
}

void test5() {
	int x;
	typeid(x); // unevaluated
}


class NoVirtual {
public:
	int x;
};

void test6() {
	NoVirtual x;
	typeid(*&x); // unevaluated
}

class Virtual {
public:
	int x;
	virtual int GetX();
};

void test7() {
	Virtual x;
	typeid(x); // evaluated
}

void test8() {
	typeid(4); // unevaluated
}

Virtual getAVirtual();

void test9() {
	typeid(getAVirtual()); // unevaluated
}

void constExprIf() {
  if constexpr(sizeof(int) == 4) { } // unevaluated
}

// semmle-extractor-options: -std=c++20