#define concat0(a0,a1) a0  ??=??=a1 // trigraph ##
#define concat1(a0,a1) a0  %:%:a1   // digraph ##


#define STRINGIFY0(s) ??=  s  // trigraph #
#define STRINGIFY1(s) %:  s   // digraph #

#define msg0(x) printf("%c: %d\n", ??=@  x, x) // trigraph #@
#define msg1(x) printf("%c: %d\n", %:@  x, x)  // digraph #@

// trigraph {
void x() ??<

    // trigraph []
    char a  ??(??) = "a";
    // diigraph []
    char b  <::> = "b";

    bool f, g, h;
    f = g = h = true;

    // trigraph ||
    f = g  ??!??! h;
    // trigraph |=
    f  ??!= g;
    // trigraph |
    f = g  ??! h;
    // trigraph ^=
    f  ??'= g;
    // trigraph ^
    f = g  ??' h;

    // trigraph [, ]
    int m ??(5??);
    // digraph [, ]
    int n <:5:>;

// trigraph }
return; ??>

// digraph {, }
int y() <%  return 1; %>