]> granicus.if.org Git - clang/commitdiff
Allow unqualified lookup of non-dependent member functions
authorNico Weber <nicolasweber@gmx.de>
Wed, 20 Jun 2012 20:21:42 +0000 (20:21 +0000)
committerNico Weber <nicolasweber@gmx.de>
Wed, 20 Jun 2012 20:21:42 +0000 (20:21 +0000)
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

lib/Sema/SemaExpr.cpp
test/SemaTemplate/ms-lookup-template-base-classes.cpp

index 57f1605fbe923e50eb69d6b3e03045416f057f63..adc8ea814e78471a07f15806370a59d5fceff7ea 100644 (file)
@@ -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;
         }
 
index 2c422dc7e3f7e905feb3509a80b27a88643cec58..8f80cb59e8ab5dbb694c19599ff09f264794a904 100644 (file)
@@ -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