diff options
author | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-06-06 16:36:56 +0000 |
---|---|---|
committer | Richard Smith <richard-llvm@metafoo.co.uk> | 2018-06-06 16:36:56 +0000 |
commit | ef53a3e2b631f2456548a49ca459c93cd138eefb (patch) | |
tree | d25b81317ab068285897e3cc71ff47e047e69dab /clang | |
parent | 8cb6a521be9abebc2174353dcb7025f9674023fb (diff) | |
download | bcm5719-llvm-ef53a3e2b631f2456548a49ca459c93cd138eefb.tar.gz bcm5719-llvm-ef53a3e2b631f2456548a49ca459c93cd138eefb.zip |
PR37680: fix faulty assertion condition.
When looking up a template name, we can find an overload set containing a
function template and an unresolved non-type using declaration.
llvm-svn: 334106
Diffstat (limited to 'clang')
-rw-r--r-- | clang/lib/AST/ASTContext.cpp | 1 | ||||
-rw-r--r-- | clang/test/SemaTemplate/dependent-names.cpp | 12 |
2 files changed, 13 insertions, 0 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index c759c96be5b..64f45af6189 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -7292,6 +7292,7 @@ ASTContext::getOverloadedTemplateName(UnresolvedSetIterator Begin, for (UnresolvedSetIterator I = Begin; I != End; ++I) { NamedDecl *D = *I; assert(isa<FunctionTemplateDecl>(D) || + isa<UnresolvedUsingValueDecl>(D) || (isa<UsingShadowDecl>(D) && isa<FunctionTemplateDecl>(D->getUnderlyingDecl()))); *Storage++ = D; diff --git a/clang/test/SemaTemplate/dependent-names.cpp b/clang/test/SemaTemplate/dependent-names.cpp index 05ef33b535a..67ef238083f 100644 --- a/clang/test/SemaTemplate/dependent-names.cpp +++ b/clang/test/SemaTemplate/dependent-names.cpp @@ -447,3 +447,15 @@ namespace DependentUnresolvedUsingTemplate { xb.h(); // expected-note {{instantiation of}} } } + +namespace PR37680 { + template <class a> struct b : a { + using a::add; + template<int> int add() { return this->template add(0); } + }; + struct a { + template<typename T = void> int add(...); + void add(int); + }; + int f(b<a> ba) { return ba.add<0>(); } +} |