If a non-template constructor instantiated to X(X),
authorJohn McCall <rjmccall@apple.com>
Sun, 14 Dec 2014 01:46:53 +0000 (01:46 +0000)
committerJohn McCall <rjmccall@apple.com>
Sun, 14 Dec 2014 01:46:53 +0000 (01:46 +0000)
commitba912273288ce8963808816565faf7cad6a09b69
tree14df3a0607b69963fc929c2afa041673157fb291
parent81fcac72061abd5a6e16184394357bf18f2321e3
If a non-template constructor instantiated to X(X),
ignore it during overload resolution when initializing
X from a value of type cv X.

Previously, our rule here only ignored specializations
of constructor templates.  That's probably because the
standard says that constructors are outright ill-formed
if their first parameter is literally X and they're
callable with one argument.  However, Clang only
enforces that prohibition against non-implicit
instantiations; I'm not sure why, but it seems to be
deliberate.  Given that, the most sensible thing to
do is to just ignore the "illegal" constructor
regardless of where it came from.

Also, stop ignoring such constructors silently:
print a note explaining why they're being ignored.

Fixes <rdar://19199836>.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@224205 91177308-0d34-0410-b5e6-96231b3b80d8
include/clang/Basic/DiagnosticSemaKinds.td
include/clang/Sema/Overload.h
lib/AST/DeclCXX.cpp
lib/Sema/SemaOverload.cpp
test/SemaTemplate/constructor-template.cpp