#ifdef SWIG
%module xxx
#endif

// Test that decltype cases where SWIG doesn't yet support deducing the type
// are handled gracefully.
//
// To check testcases are valid C++:
// g++ -std=c++20 -Wall -W -xc++ -c cpp_decltype_unsupported.i

// Function return type
static int func_returning_int(int x = 0) { return x; }
static int global_int = 42;
decltype(func_returning_int()) func_return;
decltype(func_returning_int(0)) func_return2;

// Address of (other than char or wchar_t)
decltype(&global_int) address_of;

// Pointer dereference (other than of char* or wchar_t*).
#ifdef SWIG
%ignore pointer_to_int;
#endif
int* pointer_to_int;
decltype(*pointer_to_int) pointer_dereference = *pointer_to_int;

// Variable SWIG doesn't know about.
#ifndef SWIG
static int undeclared_variable = 1;
#endif
decltype(undeclared_variable) unknown_to_swig;

// Constructed object.
struct A {};
decltype(A()) constructed_object;

// Spaceship operator.
#include <compare>
decltype(1 <=> 2) spaceship = (1 <=> 2);

// Array dereference.
decltype(("abc"[1])) array_deref = 0;
constexpr auto array_deref2{"abc"[1]};
constexpr auto array_deref4 = ("abc"[1]);
// FIXME: SWIG fails to parse these cases:
#ifndef SWIG
decltype("abc"[1]) array_deref3 = 0;
constexpr auto array_deref5("abc"[1]);
#endif

// Comparisons.
// FIXME SWIG fails to parse both these with `Error: Missing ')'. Reached end of input.`
//decltype(1 < 2) lt_test = 0;
//decltype(1 > 2) gt_test = 0;
constexpr auto lt_test2 = 1 < 2;
constexpr auto gt_test2 = 1 > 2;

// Assignment.
bool a;
decltype((a = true) + 1) assignment = true;
