In C11, the lvalue conversions replace atomic types with the unqualified, non-atomic version. This is similar to the array-to-pointer and function-to-pointer conversions in C++.
I believe that this parallel should be reflected in template argument deduction (specifically, in the place in [temp.deduct.call] where array-to-pointer and function-to-pointer conversion is mentioned).
That is, I believe the following should compile successfully (Clang doesn’t do so at this time):
extern _Atomic const int x;
template struct C { typedef T type; };
template C foo(T);
extern decltype(foo(x))::type chk;
extern int chk;
Comments welcome.