r193203 - Sema: Allow IndirectFieldDecl to appear in a non-type template argument
Richard Smith
richard at metafoo.co.uk
Tue Oct 22 15:43:16 PDT 2013
On Tue, Oct 22, 2013 at 2:56 PM, David Majnemer <david.majnemer at gmail.com>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
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131022/36f4d5c1/attachment.html>
More information about the cfe-commits
mailing list