зеркало из https://github.com/microsoft/clang-1.git
Allow unqualified lookup of non-dependent member functions
in microsoft mode. Fixes PR12701. The code for this was already in 2 of the 3 branches of a conditional and missing in the 3rd branch, so lift it above the conditional. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@158842 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8e1e0543cc
Коммит
4b554f4756
|
@ -1466,14 +1466,14 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
|
|||
// Give a code modification hint to insert 'this->'.
|
||||
// TODO: fixit for inserting 'Base<T>::' in the other cases.
|
||||
// Actually quite difficult!
|
||||
if (getLangOpts().MicrosoftMode)
|
||||
diagnostic = diag::warn_found_via_dependent_bases_lookup;
|
||||
if (isInstance) {
|
||||
UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(
|
||||
CallsUndergoingInstantiation.back()->getCallee());
|
||||
CXXMethodDecl *DepMethod = cast_or_null<CXXMethodDecl>(
|
||||
CurMethod->getInstantiatedFromMemberFunction());
|
||||
if (DepMethod) {
|
||||
if (getLangOpts().MicrosoftMode)
|
||||
diagnostic = diag::warn_found_via_dependent_bases_lookup;
|
||||
Diag(R.getNameLoc(), diagnostic) << Name
|
||||
<< FixItHint::CreateInsertion(R.getNameLoc(), "this->");
|
||||
QualType DepThisType = DepMethod->getThisType(Context);
|
||||
|
@ -1500,8 +1500,6 @@ bool Sema::DiagnoseEmptyLookup(Scope *S, CXXScopeSpec &SS, LookupResult &R,
|
|||
Diag(R.getNameLoc(), diagnostic) << Name;
|
||||
}
|
||||
} else {
|
||||
if (getLangOpts().MicrosoftMode)
|
||||
diagnostic = diag::warn_found_via_dependent_bases_lookup;
|
||||
Diag(R.getNameLoc(), diagnostic) << Name;
|
||||
}
|
||||
|
||||
|
|
|
@ -143,3 +143,32 @@ public:
|
|||
template class A<C>;
|
||||
|
||||
}
|
||||
|
||||
namespace PR12701 {
|
||||
|
||||
class A {};
|
||||
class B {};
|
||||
|
||||
template <class T>
|
||||
class Base {
|
||||
public:
|
||||
bool base_fun(void* p) { return false; } // expected-note {{must qualify identifier to find this declaration in dependent base clas}}
|
||||
operator T*() const { return 0; }
|
||||
};
|
||||
|
||||
template <class T>
|
||||
class Container : public Base<T> {
|
||||
public:
|
||||
template <typename S>
|
||||
bool operator=(const Container<S>& rhs) {
|
||||
return base_fun(rhs); // expected-warning {{use of identifier 'base_fun' found via unqualified lookup into dependent bases of class templates is a Microsoft extension}}
|
||||
}
|
||||
};
|
||||
|
||||
void f() {
|
||||
Container<A> text_provider;
|
||||
Container<B> text_provider2;
|
||||
text_provider2 = text_provider; // expected-note {{in instantiation of function template specialization}}
|
||||
}
|
||||
|
||||
} // namespace PR12701
|
||||
|
|
Загрузка…
Ссылка в новой задаче