public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/67033] New: [c++11] template argument invalid for integral constant expression beginning with address-of expression
@ 2015-07-27 20:36 ed at catmur dot co.uk
  2015-07-27 20:55 ` [Bug c++/67033] " ed at catmur dot co.uk
  2021-07-29 21:06 ` pinskia at gcc dot gnu.org
  0 siblings, 2 replies; 3+ messages in thread
From: ed at catmur dot co.uk @ 2015-07-27 20:36 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67033

            Bug ID: 67033
           Summary: [c++11] template argument invalid for integral
                    constant expression beginning with address-of
                    expression
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ed at catmur dot co.uk
  Target Milestone: ---

template<bool B> struct S { };
int x;
S<&x == &x> s;
// error: template argument 1 is invalid
//        ^

&x == &x is a valid converted constant expression of type bool.

The problem is that cp_parser_template_argument sees the initial '&' and
decides that the non-type template argument must be the address-of operator
applied to an id-expression; when it fails to reach the end of the template
argument it aborts.

This behavior is valid for <= C++03, where '&' cannot appear in a constant
expression, but C++11 is more relaxed.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug c++/67033] [c++11] template argument invalid for integral constant expression beginning with address-of expression
  2015-07-27 20:36 [Bug c++/67033] New: [c++11] template argument invalid for integral constant expression beginning with address-of expression ed at catmur dot co.uk
@ 2015-07-27 20:55 ` ed at catmur dot co.uk
  2021-07-29 21:06 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: ed at catmur dot co.uk @ 2015-07-27 20:55 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67033

--- Comment #1 from Ed Catmur <ed at catmur dot co.uk> ---
Created attachment 36075
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=36075&action=edit
pr67033.patch

This is kinda ugly.

The problem is that before C++1z, a non-type template argument that evaluates
to the address of or a reference to an object [...] must be expressed as "&
id-expression" [...]; this means that the parser isn't really the place for
this, as the validity of the expression depends on its value:

template<int* p> class X {};
int i;
X<&i> x1;      // OK
X<(&(i))> x2;  // OK since C++11
template<bool b> class Y : X<b ? &i : nullptr> {};  // OK since C++11 if !b
X<true ? &i : nullptr> x3; // OK since C++1z

The attached patch lets through quite a lot of constructs that are actually
invalid pre-C++1z. A rigorous check would be to annotate the constant
expression to say whether it matches the form allowed in [temp.arg.nontype] and
then on evaluation check whether it is a null pointer constant.


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [Bug c++/67033] [c++11] template argument invalid for integral constant expression beginning with address-of expression
  2015-07-27 20:36 [Bug c++/67033] New: [c++11] template argument invalid for integral constant expression beginning with address-of expression ed at catmur dot co.uk
  2015-07-27 20:55 ` [Bug c++/67033] " ed at catmur dot co.uk
@ 2021-07-29 21:06 ` pinskia at gcc dot gnu.org
  1 sibling, 0 replies; 3+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-07-29 21:06 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67033

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
   Target Milestone|---                         |6.0
         Resolution|---                         |FIXED

--- Comment #3 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Marek Polacek from comment #2)
> Confirmed.
> 
> Testcase from PR56428:

This is a different issue overall related to PMF rather than to addresses, I
filed PR 101681 for that.

(In reply to Ed Catmur from comment #1)
> template<int* p> class X {};
> int i;
> X<&i> x1;      // OK
> X<(&(i))> x2;  // OK since C++11
> template<bool b> class Y : X<b ? &i : nullptr> {};  // OK since C++11 if !b
> X<true ? &i : nullptr> x3; // OK since C++1z

GCC 6+ does the correct thing for the testcase in comment #1 so closing.

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2021-07-29 21:06 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-27 20:36 [Bug c++/67033] New: [c++11] template argument invalid for integral constant expression beginning with address-of expression ed at catmur dot co.uk
2015-07-27 20:55 ` [Bug c++/67033] " ed at catmur dot co.uk
2021-07-29 21:06 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).