From: Richard Smith Date: Thu, 15 Nov 2012 00:31:27 +0000 (+0000) Subject: Per [basic.lookup.classref]p3, in an expression of the form p->~type-name, the X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=d6537015745128064dc12fcc06af65372dfd5da9;p=clang Per [basic.lookup.classref]p3, in an expression of the form p->~type-name, the type-name is looked up in the context of the complete postfix-expression. Don't forget to pass the scope into this lookup when the type-name is a template-id; it might name an alias template which can't be found within the class itself. Bug spotted by Johannes Schaub on #llvm. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@168011 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index f56b05406d..1fa554abd0 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -2387,7 +2387,7 @@ TemplateNameKind Sema::ActOnDependentTemplateName(Scope *S, // "template" keyword is now permitted). We follow the C++0x // rules, even in C++03 mode with a warning, retroactively applying the DR. bool MemberOfUnknownSpecialization; - TemplateNameKind TNK = isTemplateName(0, SS, TemplateKWLoc.isValid(), Name, + TemplateNameKind TNK = isTemplateName(S, SS, TemplateKWLoc.isValid(), Name, ObjectType, EnteringContext, Result, MemberOfUnknownSpecialization); if (TNK == TNK_Non_template && LookupCtx->isDependentContext() && diff --git a/test/SemaCXX/member-expr.cpp b/test/SemaCXX/member-expr.cpp index 763f9c754c..515bcd43b2 100644 --- a/test/SemaCXX/member-expr.cpp +++ b/test/SemaCXX/member-expr.cpp @@ -111,8 +111,13 @@ namespace rdar8231724 { struct X { }; struct Y : X { }; + template struct Z { int n; }; + void f(Y *y) { y->N::X1; // expected-error{{'rdar8231724::N::X1' is not a member of class 'rdar8231724::Y'}} + y->Z::n; // expected-error{{'rdar8231724::Z::n' is not a member of class 'rdar8231724::Y'}} + y->template Z::n; // expected-error{{'rdar8231724::Z::n' is not a member of class 'rdar8231724::Y'}} \ + // expected-warning{{'template' keyword outside of a template}} } } diff --git a/test/SemaCXX/pseudo-destructors.cpp b/test/SemaCXX/pseudo-destructors.cpp index a8f6683ced..95363e5f6b 100644 --- a/test/SemaCXX/pseudo-destructors.cpp +++ b/test/SemaCXX/pseudo-destructors.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s struct A {}; enum Foo { F }; @@ -80,3 +80,8 @@ namespace PR11339 { template void destroy(int*); // expected-note{{in instantiation of function template specialization}} } + +template using Id = T; +void AliasTemplate(int *p) { + p->~Id(); +}