diff options
author | David Majnemer <david.majnemer@gmail.com> | 2013-12-10 00:40:58 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2013-12-10 00:40:58 +0000 |
commit | cd053cd5ed0862b36b59bce06e45dc5564b5999a (patch) | |
tree | 216bff75102441a4ace25880386c749ad20ed553 | |
parent | 5090d57c244fe6bc45ffb11048315d4bafefd4d4 (diff) | |
download | bcm5719-llvm-cd053cd5ed0862b36b59bce06e45dc5564b5999a.tar.gz bcm5719-llvm-cd053cd5ed0862b36b59bce06e45dc5564b5999a.zip |
Sema: Enforce C++11 pointer-to-member template arguments should rules
The standard is pretty clear on what it allows inside of template
arguments for non-type template parameters of pointer-to-member.
They must be of the form &qualified-id and cannot come from sources like
constexpr VarDecls or things of that nature.
This fixes PR18192.
llvm-svn: 196852
-rw-r--r-- | clang/lib/Sema/SemaTemplate.cpp | 4 | ||||
-rw-r--r-- | clang/test/SemaTemplate/instantiate-member-pointers.cpp | 9 |
2 files changed, 9 insertions, 4 deletions
diff --git a/clang/lib/Sema/SemaTemplate.cpp b/clang/lib/Sema/SemaTemplate.cpp index d72c04c0121..20a3d283314 100644 --- a/clang/lib/Sema/SemaTemplate.cpp +++ b/clang/lib/Sema/SemaTemplate.cpp @@ -4584,9 +4584,7 @@ static bool CheckTemplateArgumentPointerToMember(Sema &S, else if ((DRE = dyn_cast<DeclRefExpr>(Arg))) { if (ValueDecl *VD = dyn_cast<ValueDecl>(DRE->getDecl())) { if (VD->getType()->isMemberPointerType()) { - if (isa<NonTypeTemplateParmDecl>(VD) || - (isa<VarDecl>(VD) && - S.Context.getCanonicalType(VD->getType()).isConstQualified())) { + if (isa<NonTypeTemplateParmDecl>(VD)) { if (Arg->isTypeDependent() || Arg->isValueDependent()) { Converted = TemplateArgument(Arg); } else { diff --git a/clang/test/SemaTemplate/instantiate-member-pointers.cpp b/clang/test/SemaTemplate/instantiate-member-pointers.cpp index 0db90e3cbf1..4757870d13b 100644 --- a/clang/test/SemaTemplate/instantiate-member-pointers.cpp +++ b/clang/test/SemaTemplate/instantiate-member-pointers.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 %s struct Y { int x; }; @@ -65,3 +65,10 @@ namespace ValueDepMemberPointer { } S<int> s; } + +namespace PR18192 { + struct A { struct { int n; }; }; + template<int A::*> struct X {}; + constexpr int A::*p = &A::n; + X<p> x; // expected-error{{not a pointer to member constant}} +} |