r196852 - Sema: Enforce C++11 pointer-to-member template arguments should rules
David Majnemer
david.majnemer at gmail.com
Mon Dec 9 16:40:59 PST 2013
Author: majnemer
Date: Mon Dec 9 18:40:58 2013
New Revision: 196852
URL: http://llvm.org/viewvc/llvm-project?rev=196852&view=rev
Log:
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.
Modified:
cfe/trunk/lib/Sema/SemaTemplate.cpp
cfe/trunk/test/SemaTemplate/instantiate-member-pointers.cpp
Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=196852&r1=196851&r2=196852&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaTemplate.cpp (original)
+++ cfe/trunk/lib/Sema/SemaTemplate.cpp Mon Dec 9 18:40:58 2013
@@ -4584,9 +4584,7 @@ static bool CheckTemplateArgumentPointer
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 {
Modified: cfe/trunk/test/SemaTemplate/instantiate-member-pointers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/instantiate-member-pointers.cpp?rev=196852&r1=196851&r2=196852&view=diff
==============================================================================
--- cfe/trunk/test/SemaTemplate/instantiate-member-pointers.cpp (original)
+++ cfe/trunk/test/SemaTemplate/instantiate-member-pointers.cpp Mon Dec 9 18:40:58 2013
@@ -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}}
+}
More information about the cfe-commits
mailing list