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