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)
commit578a1f8c6d275d2d3ffe327e72e4cbfed5bad7d8
tree20958f18531da4727cde35208a636a9969ea59ce
parent706f315e65841a964029c950e8569e6403f7793f
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>.

llvm-svn: 224205
clang/include/clang/Basic/DiagnosticSemaKinds.td
clang/include/clang/Sema/Overload.h
clang/lib/AST/DeclCXX.cpp
clang/lib/Sema/SemaOverload.cpp
clang/test/SemaTemplate/constructor-template.cpp