public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/52018] New: GCC refuses to accept a disambiguation statement
@ 2012-01-27 12:53 piotr.wyderski at gmail dot com
2012-01-30 9:24 ` [Bug c++/52018] " daniel.kruegler at googlemail dot com
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: piotr.wyderski at gmail dot com @ 2012-01-27 12:53 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52018
Bug #: 52018
Summary: GCC refuses to accept a disambiguation statement
Classification: Unclassified
Product: gcc
Version: 4.6.2
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned@gcc.gnu.org
ReportedBy: piotr.wyderski@gmail.com
The following code:
class string {};
struct test {
enum {
string
};
void g(class string&& s) const {}
template <typename... TA> void mth(TA&&... args) const {
g(class string{std::forward<TA>(args)...});
}
};
compiled using GCC 4.6.1 and 4.6.2 fails:
$ g++ -std=gnu++0x -c test/test.cpp
test/test.cpp: In member function ‘void test::mth(TA&& ...) const’:
test/test.cpp:15:11: error: expected primary-expression before ‘class’
The Holy Book says:
3.4.4: "An elaborated-type-specifier (7.1.6.3) may be used to refer to a
previously declared class-name or enum-name
even though the name has been hidden by a non-type declaration (3.3.10)."
and the problematic statement:
g(class string{std::forward<TA>(args)...});
looks like a reference.
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/52018] GCC refuses to accept a disambiguation statement
2012-01-27 12:53 [Bug c++/52018] New: GCC refuses to accept a disambiguation statement piotr.wyderski at gmail dot com
@ 2012-01-30 9:24 ` daniel.kruegler at googlemail dot com
2012-01-31 8:24 ` daniel.kruegler at googlemail dot com
2012-01-31 16:11 ` paolo.carlini at oracle dot com
2 siblings, 0 replies; 4+ messages in thread
From: daniel.kruegler at googlemail dot com @ 2012-01-30 9:24 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52018
Daniel Krügler <daniel.kruegler at googlemail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |daniel.kruegler at
| |googlemail dot com
--- Comment #1 from Daniel Krügler <daniel.kruegler at googlemail dot com> 2012-01-30 08:56:28 UTC ---
The compiler behaves conforming: An elaborated type specifier is not allowed in
this context (see [expr.type.conv] p1 which says "A simple-type-specifier
(7.1.6.2) or typename-specifier (14.6) [..]", they are only allowed in
restricted context like a new expression for example. Note that similar
expressions apply more general type-specifiers like "unsigned int" which cannot
be used in such an expression. In other words: This does not look like a bug to
me. A reduced example would be the following snippet:
struct string { string(int); };
enum { string };
void h(struct string);
int main() {
h(class string(42));
}
A simple workaround is to introduce a local typename-specifier:
typedef class string c_t;
h(c_t(42));
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/52018] GCC refuses to accept a disambiguation statement
2012-01-27 12:53 [Bug c++/52018] New: GCC refuses to accept a disambiguation statement piotr.wyderski at gmail dot com
2012-01-30 9:24 ` [Bug c++/52018] " daniel.kruegler at googlemail dot com
@ 2012-01-31 8:24 ` daniel.kruegler at googlemail dot com
2012-01-31 16:11 ` paolo.carlini at oracle dot com
2 siblings, 0 replies; 4+ messages in thread
From: daniel.kruegler at googlemail dot com @ 2012-01-31 8:24 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52018
--- Comment #2 from Daniel Krügler <daniel.kruegler at googlemail dot com> 2012-01-31 07:33:25 UTC ---
(In reply to comment #1)
> A simple workaround is to introduce a local typename-specifier:
>
> typedef class string c_t;
> h(c_t(42));
or use a static_cast (which has the additional advantage of not allowing a
silent reinterpret_cast):
struct string { string(int); };
enum { string };
void h(struct string);
int main() {
h(static_cast<class string>(42));
}
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Bug c++/52018] GCC refuses to accept a disambiguation statement
2012-01-27 12:53 [Bug c++/52018] New: GCC refuses to accept a disambiguation statement piotr.wyderski at gmail dot com
2012-01-30 9:24 ` [Bug c++/52018] " daniel.kruegler at googlemail dot com
2012-01-31 8:24 ` daniel.kruegler at googlemail dot com
@ 2012-01-31 16:11 ` paolo.carlini at oracle dot com
2 siblings, 0 replies; 4+ messages in thread
From: paolo.carlini at oracle dot com @ 2012-01-31 16:11 UTC (permalink / raw)
To: gcc-bugs
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52018
Paolo Carlini <paolo.carlini at oracle dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |RESOLVED
Resolution| |INVALID
--- Comment #3 from Paolo Carlini <paolo.carlini at oracle dot com> 2012-01-31 15:51:46 UTC ---
Closing then.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2012-01-31 15:52 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-01-27 12:53 [Bug c++/52018] New: GCC refuses to accept a disambiguation statement piotr.wyderski at gmail dot com
2012-01-30 9:24 ` [Bug c++/52018] " daniel.kruegler at googlemail dot com
2012-01-31 8:24 ` daniel.kruegler at googlemail dot com
2012-01-31 16:11 ` paolo.carlini at oracle dot com
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).