From: David Majnemer Date: Tue, 22 Oct 2013 21:56:38 +0000 (+0000) Subject: Sema: Allow IndirectFieldDecl to appear in a non-type template argument X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=255ca71082810ac8d3084f43727675e02a384683;p=clang Sema: Allow IndirectFieldDecl to appear in a non-type template argument We would not identify pointer-to-member construction in a non-type template argument if it was either a FieldDecl or a CXXMethodDecl. However, this would incorrectly reject declarations that were injected via an IndirectFieldDecl (e.g. a field inside of an anonymous union). This fixes PR17657. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@193203 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplate.cpp b/lib/Sema/SemaTemplate.cpp index c49756d9aa..c8e2b0dd89 100644 --- a/lib/Sema/SemaTemplate.cpp +++ b/lib/Sema/SemaTemplate.cpp @@ -4609,8 +4609,11 @@ static bool CheckTemplateArgumentPointerToMember(Sema &S, diag::err_template_arg_not_pointer_to_member_form) << Arg->getSourceRange(); - if (isa(DRE->getDecl()) || isa(DRE->getDecl())) { + if (isa(DRE->getDecl()) || + isa(DRE->getDecl()) || + isa(DRE->getDecl())) { assert((isa(DRE->getDecl()) || + isa(DRE->getDecl()) || !cast(DRE->getDecl())->isStatic()) && "Only non-static member pointers can make it here"); diff --git a/test/SemaTemplate/temp_arg_nontype.cpp b/test/SemaTemplate/temp_arg_nontype.cpp index 4a75b11c42..fcdfd458f3 100644 --- a/test/SemaTemplate/temp_arg_nontype.cpp +++ b/test/SemaTemplate/temp_arg_nontype.cpp @@ -75,6 +75,9 @@ struct Z { int int_member; float float_member; + union { + int union_member; + }; }; template struct A6; // expected-note{{template parameter is declared here}} A6<&Z::foo> *a17_1; @@ -88,6 +91,7 @@ A7<&Z::int_member> *a18_1; A7c<&Z::int_member> *a18_2; A7<&Z::float_member> *a18_3; // expected-error{{non-type template argument of type 'float Z::*' cannot be converted to a value of type 'int Z::*'}} A7c<(&Z::int_member)> *a18_4; // expected-warning{{address non-type template argument cannot be surrounded by parentheses}} +A7c<&Z::union_member> *a18_5; template struct Overflow; // expected-note{{template parameter is declared here}}