<div class="gmail_quote">On Mon, Aug 16, 2010 at 12:31 AM, Abramo Bagnara <span dir="ltr"><<a href="mailto:abramo.bagnara@gmail.com">abramo.bagnara@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
The following typescript show the issue:<br>
<br>
$ cat t.cc<br>
<br>
template <int *ptr><br>
struct S1 { };<br>
<br>
template <bool b><br>
struct S2 { };<br>
<br>
int v1;<br>
<br>
S1<(&v1)> x;<br>
S2<(2>2)> y;<br>
$ clang -c t.cc<br>
t.cc:10:4: error: non-type template argument cannot be surrounded by<br>
parentheses<br>
S1<(&v1)> x;<br>
   ^~~~~<br>
1 error generated.<br>
<br>
My notes:<br>
<br>
1) in my opinion the diagnostic is due to a needless too strong<br>
interpretation of the standard:<br>
<br>
- comeau and intel does not mark this as an error<br>
<br>
- gcc seems to mark this as an error due to some bug (the diagnostic  is<br>
very weird)<br></blockquote><div><br></div><div>The standard seems really really clear here -- the argument is *not* an expression, it's an address. You're only provided one mechanism for writing an address in this context: '& id-expression', with the '&' being optional in certain cases. You can't even write '0' here. I think it's actually useful to preclude parentheses as they make this look like an expression, which it simply is not. You can't write '(&foo + sizeof(int))' to advance past one element of an int array either.</div>
<div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
2) also if there is disagreement about 1 I don't see the reason to<br>
generate an error instead of a warning<br></blockquote><div><br></div><div>A ExtWarn seems not implausible here, but I'm not sure why supporting this is important.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
3) that apart the diagnostic message is misleading: non-type template<br>
argument might (and sometimes should, see the following line in source)<br>
be surrounded by parentheses<br></blockquote><div><br></div><div>The second line is a completely different non-type template argument: an integral constant-expression. There are no parentheses around the template argument, there are parentheses as part of the constant-expression, which allows parentheses among many other constructs. It is certainly unfortunate that there is no way to write a '>' in an ICE without parentheses, but I don't think that artifact necessarily warrants allowing parentheses for all template arguments, or even for all non-type template arguments...</div>
</div>