test t(3) would call default constructor first, then do val = 3
No default constructor is called. val is default-initialised before the test constructor body; if val were a type with a default constructor, then that constructor would be called. But int doesn't have a constructor, and default-initialising just leaves it in its uninitialised state with an indeterminate value.
Perhaps you were thinking that this might call the default constructor of test. It doesn't; no constructor of test would do that, unless you explicitly delegated to that constructor.
if there is at least a user-defined constructor, then the compiler does not generate an implicit default constructor
That's correct, declaring any constructor prevents the implicit default constructor.
is there a contradiction?
No. test doesn't have a default constructor, but nothing here tries to use such a thing.