/*
TEST_OUTPUT:
---
fail_compilation/diag8648.d(18): Error: undefined identifier `X`
fail_compilation/diag8648.d(29): Error: none of the overloads of template `diag8648.foo` are callable using argument types `!()(Foo!(int, 1))`
fail_compilation/diag8648.d(18):        Candidate is: `foo(T, n)(X!(T, n))`
fail_compilation/diag8648.d(20): Error: undefined identifier `a`
fail_compilation/diag8648.d(31): Error: none of the overloads of template `diag8648.bar` are callable using argument types `!()(Foo!(int, 1))`
fail_compilation/diag8648.d(20):        Candidate is: `bar(T)(Foo!(T, a))`
fail_compilation/diag8648.d(20): Error: undefined identifier `a`
fail_compilation/diag8648.d(32): Error: none of the overloads of template `diag8648.bar` are callable using argument types `!()(Foo!(int, f))`
fail_compilation/diag8648.d(20):        Candidate is: `bar(T)(Foo!(T, a))`
---
*/
struct Foo(T, alias a) {}
void foo(T, n)(X!(T, n) ) {}    // undefined identifier 'X'
void bar(T)(Foo!(T, a) ) {}     // undefined identifier 'a'
void main()
{
    template f() {}
    Foo!(int, 1) x;
    Foo!(int, f) y;
    foo(x);
    bar(x); // expression '1' vs undefined Type 'a'
    bar(y); // symbol 'f' vs undefined Type 'a'
}