On Tue, Oct 22, 2013 at 2:56 PM, David Majnemer <[email protected]>wrote:
> Author: majnemer > Date: Tue Oct 22 16:56:38 2013 > New Revision: 193203 > > URL: http://llvm.org/viewvc/llvm-project?rev=193203&view=rev > Log: > 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). > Is this really correct? Such fields are not members of the enclosing non-anonymous struct. &Z::union_member below should have type "int Z::<anonymous union>::*", not "int Z::*", as far as I can tell. This fixes PR17657. > > Modified: > cfe/trunk/lib/Sema/SemaTemplate.cpp > cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp > > Modified: cfe/trunk/lib/Sema/SemaTemplate.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaTemplate.cpp?rev=193203&r1=193202&r2=193203&view=diff > > ============================================================================== > --- cfe/trunk/lib/Sema/SemaTemplate.cpp (original) > +++ cfe/trunk/lib/Sema/SemaTemplate.cpp Tue Oct 22 16:56:38 2013 > @@ -4609,8 +4609,11 @@ static bool CheckTemplateArgumentPointer > diag::err_template_arg_not_pointer_to_member_form) > << Arg->getSourceRange(); > > - if (isa<FieldDecl>(DRE->getDecl()) || > isa<CXXMethodDecl>(DRE->getDecl())) { > + if (isa<FieldDecl>(DRE->getDecl()) || > + isa<IndirectFieldDecl>(DRE->getDecl()) || > + isa<CXXMethodDecl>(DRE->getDecl())) { > assert((isa<FieldDecl>(DRE->getDecl()) || > + isa<IndirectFieldDecl>(DRE->getDecl()) || > !cast<CXXMethodDecl>(DRE->getDecl())->isStatic()) && > "Only non-static member pointers can make it here"); > > > Modified: cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp?rev=193203&r1=193202&r2=193203&view=diff > > ============================================================================== > --- cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp (original) > +++ cfe/trunk/test/SemaTemplate/temp_arg_nontype.cpp Tue Oct 22 16:56:38 > 2013 > @@ -75,6 +75,9 @@ struct Z { > > int int_member; > float float_member; > + union { > + int union_member; > + }; > }; > template<int (Z::*pmf)(int)> 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; > Can we mangle this? > template<unsigned char C> struct Overflow; // expected-note{{template > parameter is declared here}} > > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
