]> granicus.if.org Git - clang/commitdiff
[ms] Don't try to delay lookup for failures in SFINAE context (PR23823)
authorHans Wennborg <hans@hanshq.net>
Fri, 12 Jun 2015 21:23:23 +0000 (21:23 +0000)
committerHans Wennborg <hans@hanshq.net>
Fri, 12 Jun 2015 21:23:23 +0000 (21:23 +0000)
The underlying problem in PR23823 already existed before my recent change
in r239558, but that change made it worse (failing not only for undeclared
symbols, but also failed overload resolution). This makes Clang not try to
delay the lookup in SFINAE context. I assume no current code is relying on
SFINAE working with lookups that need to be delayed, because that never
seems to have worked.

Differential Revision: http://reviews.llvm.org/D10417

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@239639 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 117ca135a22dec19ae097279a67eccd76027f5e4..f8610e009bdf87dc0bcca4ef9dc7e166dce041bc 100644 (file)
@@ -10750,7 +10750,8 @@ bool Sema::buildOverloadedCallSet(Scope *S, Expr *Fn,
   // functions, including those from argument-dependent lookup.
   AddOverloadedCallCandidates(ULE, Args, *CandidateSet);
 
-  if (getLangOpts().MSVCCompat && CurContext->isDependentContext() &&
+  if (getLangOpts().MSVCCompat &&
+      CurContext->isDependentContext() && !isSFINAEContext() &&
       (isa<FunctionDecl>(CurContext) || isa<CXXRecordDecl>(CurContext))) {
 
     OverloadCandidateSet::iterator Best;
index 90e9f0a48ab3697b6eac7e09eed3ec2b54deed9e..9fa59e626ee7b4189465a8ec0aaf0416312dbaa2 100644 (file)
@@ -563,3 +563,13 @@ void test() {
   x.member(); // expected-note{{requested here}}
 };
 }
+
+namespace PR23823 {
+// Don't delay lookup in SFINAE context.
+template <typename T> decltype(g(T())) check(); // expected-note{{candidate template ignored: substitution failure [with T = int]: use of undeclared identifier 'g'}}
+decltype(check<int>()) x; // expected-error{{no matching function for call to 'check'}}
+
+void h();
+template <typename T> decltype(h(T())) check2(); // expected-note{{candidate template ignored: substitution failure [with T = int]: no matching function for call to 'h'}}
+decltype(check2<int>()) y; // expected-error{{no matching function for call to 'check2'}}
+}