Fix implementation of [temp.local]p4.
authorRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 15 Feb 2019 21:53:07 +0000 (21:53 +0000)
committerRichard Smith <richard-llvm@metafoo.co.uk>
Fri, 15 Feb 2019 21:53:07 +0000 (21:53 +0000)
commitafcfb6bc3a92c494bce8000651df8da7476d25f8
tree62b002698ce995e648e68afe516db3ccffc51937
parent9982ee5472f87059cee75146293d0742f95bacc8
Fix implementation of [temp.local]p4.

When a template-name is looked up, we need to give injected-class-name
declarations of class templates special treatment, as they denote a
template rather than a type.

Previously we achieved this by applying a filter to the lookup results
after completing name lookup, but that is incorrect in various ways, not
least of which is that it lost all information about access and how
members were named, and the filtering caused us to generally lose
all ambiguity errors between templates and non-templates.

We now preserve the lookup results exactly, and the few places that need
to map from a declaration found by name lookup into a declaration of a
template do so explicitly. Deduplication of repeated lookup results of
the same injected-class-name declaration is done by name lookup instead
of after the fact.

This reinstates r354091, which was previously reverted in r354097
because it exposed bugs in lldb and compiler-rt. Those bugs were fixed
in r354173 and r354174 respectively.

llvm-svn: 354176
clang/include/clang/Sema/Lookup.h
clang/include/clang/Sema/Sema.h
clang/lib/Sema/SemaDecl.cpp
clang/lib/Sema/SemaDeclCXX.cpp
clang/lib/Sema/SemaLookup.cpp
clang/lib/Sema/SemaTemplate.cpp
clang/test/CXX/class.access/p4.cpp
clang/test/CXX/temp/temp.decls/temp.friend/p1.cpp
clang/test/SemaTemplate/temp.cpp