public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching
@ 2010-07-21 2:43 rodolfo at rodsoft dot org
2010-07-21 2:49 ` [Bug c++/45012] " rodolfo at rodsoft dot org
` (3 more replies)
0 siblings, 4 replies; 5+ messages in thread
From: rodolfo at rodsoft dot org @ 2010-07-21 2:43 UTC (permalink / raw)
To: gcc-bugs
The following code doesn't compile unless variable RUNTIME is defined as a
"static const int" instead of an "enum":
#include <type_traits>
enum { RUNTIME = 0 };
// it compiles with the previous line commented out and the next commented in
// static const int RUNTIME=0;
template <class T, class U, class EN=void> struct foo;
template <template<int> class V, int M>
struct foo<V<M>,V<M>, typename std::enable_if<M==RUNTIME || M==2>::type> {};
template <template<int> class V1, template<int> class V2, int M>
struct foo<V1<M>,V2<M>, typename std::enable_if<M==RUNTIME || M==2>::type> {};
template <int M> struct bar {};
foo<bar<2>,bar<2>> x;
--
Summary: Invalid ambiguity on partial class specialization
matching
Product: gcc
Version: 4.5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: rodolfo at rodsoft dot org
GCC build triplet: x86_64-pc-linux-gnu
GCC host triplet: x86_64-pc-linux-gnu
GCC target triplet: x86_64-pc-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/45012] Invalid ambiguity on partial class specialization matching
2010-07-21 2:43 [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching rodolfo at rodsoft dot org
@ 2010-07-21 2:49 ` rodolfo at rodsoft dot org
2010-07-21 2:53 ` [Bug c++/45012] New: " Andrew Pinski
` (2 subsequent siblings)
3 siblings, 0 replies; 5+ messages in thread
From: rodolfo at rodsoft dot org @ 2010-07-21 2:49 UTC (permalink / raw)
To: gcc-bugs
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 1338 bytes --]
------- Comment #1 from rodolfo at rodsoft dot org 2010-07-21 02:49 -------
The code I posted was meant to be compiled in c++0x mode, but if we write
directly the definition of std::enable_if, it also happens in c++03 mode.
So, instead of #include <type_traits>, one should write:
template <bool B, class T=void> struct enable_if;
template <class T>
struct enable_if<true,T>
{
typedef T type;
};
Of course, I forgot to add the error messages:
teste.cpp:30: error: ambiguous class template instantiation for struct
foo<bar<2>, bar<2>, void>
teste.cpp:19: error: candidates are: struct foo<V<M>, V<M>, typename
enable_if<((M == RUNTIME) || (M == 2)), void>::type>
teste.cpp:25: error: struct foo<V1<M>, V2<M>, typename
enable_if<((M == RUNTIME) || (M == 2)), void>::type>
teste.cpp:30: error: aggregate foo<bar<2>, bar<2>, void> x has incomplete
type and cannot be defined
--
rodolfo at rodsoft dot org changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |rodolfo at rodsoft dot org
Keywords| |rejects-valid
Known to fail| |4.4.3 4.5.0
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching
2010-07-21 2:43 [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching rodolfo at rodsoft dot org
2010-07-21 2:49 ` [Bug c++/45012] " rodolfo at rodsoft dot org
@ 2010-07-21 2:53 ` Andrew Pinski
2010-07-21 2:54 ` [Bug c++/45012] " pinskia at gmail dot com
2010-07-21 3:03 ` rodolfo at rodsoft dot org
3 siblings, 0 replies; 5+ messages in thread
From: Andrew Pinski @ 2010-07-21 2:53 UTC (permalink / raw)
To: gcc-bugzilla; +Cc: gcc-bugs
On Jul 20, 2010, at 7:43 PM, "rodolfo at rodsoft dot org" <gcc-bugzilla@gcc.gnu.org
> wrote:
> The following code doesn't compile unless variable RUNTIME is
> defined as a
> "static const int" instead of an "enum":
>
This enum value has an anonymous type which is not valid in the
context of templates in C++03/98. It is valid in the current draft of C
++0x though. But I cannot remember if 4.5 implements that rule for -
std=gnu++0x (-std=c++0x).
> #include <type_traits>
>
> enum { RUNTIME = 0 };
> // it compiles with the previous line commented out and the next
> commented in
> // static const int RUNTIME=0;
>
> template <class T, class U, class EN=void> struct foo;
>
> template <template<int> class V, int M>
> struct foo<V<M>,V<M>, typename std::enable_if<M==RUNTIME ||
> M==2>::type> {};
>
> template <template<int> class V1, template<int> class V2, int M>
> struct foo<V1<M>,V2<M>, typename std::enable_if<M==RUNTIME ||
> M==2>::type> {};
>
> template <int M> struct bar {};
>
> foo<bar<2>,bar<2>> x;
>
>
> --
> Summary: Invalid ambiguity on partial class specialization
> matching
> Product: gcc
> Version: 4.5.0
> Status: UNCONFIRMED
> Severity: normal
> Priority: P3
> Component: c++
> AssignedTo: unassigned at gcc dot gnu dot org
> ReportedBy: rodolfo at rodsoft dot org
> GCC build triplet: x86_64-pc-linux-gnu
> GCC host triplet: x86_64-pc-linux-gnu
> GCC target triplet: x86_64-pc-linux-gnu
>
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/45012] Invalid ambiguity on partial class specialization matching
2010-07-21 2:43 [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching rodolfo at rodsoft dot org
2010-07-21 2:49 ` [Bug c++/45012] " rodolfo at rodsoft dot org
2010-07-21 2:53 ` [Bug c++/45012] New: " Andrew Pinski
@ 2010-07-21 2:54 ` pinskia at gmail dot com
2010-07-21 3:03 ` rodolfo at rodsoft dot org
3 siblings, 0 replies; 5+ messages in thread
From: pinskia at gmail dot com @ 2010-07-21 2:54 UTC (permalink / raw)
To: gcc-bugs
------- Comment #2 from pinskia at gmail dot com 2010-07-21 02:53 -------
Subject: Re: New: Invalid ambiguity on partial class specialization matching
On Jul 20, 2010, at 7:43 PM, "rodolfo at rodsoft dot org"
<gcc-bugzilla@gcc.gnu.org
> wrote:
> The following code doesn't compile unless variable RUNTIME is
> defined as a
> "static const int" instead of an "enum":
>
This enum value has an anonymous type which is not valid in the
context of templates in C++03/98. It is valid in the current draft of C
++0x though. But I cannot remember if 4.5 implements that rule for -
std=gnu++0x (-std=c++0x).
> #include <type_traits>
>
> enum { RUNTIME = 0 };
> // it compiles with the previous line commented out and the next
> commented in
> // static const int RUNTIME=0;
>
> template <class T, class U, class EN=void> struct foo;
>
> template <template<int> class V, int M>
> struct foo<V<M>,V<M>, typename std::enable_if<M==RUNTIME ||
> M==2>::type> {};
>
> template <template<int> class V1, template<int> class V2, int M>
> struct foo<V1<M>,V2<M>, typename std::enable_if<M==RUNTIME ||
> M==2>::type> {};
>
> template <int M> struct bar {};
>
> foo<bar<2>,bar<2>> x;
>
>
> --
> Summary: Invalid ambiguity on partial class specialization
> matching
> Product: gcc
> Version: 4.5.0
> Status: UNCONFIRMED
> Severity: normal
> Priority: P3
> Component: c++
> AssignedTo: unassigned at gcc dot gnu dot org
> ReportedBy: rodolfo at rodsoft dot org
> GCC build triplet: x86_64-pc-linux-gnu
> GCC host triplet: x86_64-pc-linux-gnu
> GCC target triplet: x86_64-pc-linux-gnu
>
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012
>
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012
^ permalink raw reply [flat|nested] 5+ messages in thread
* [Bug c++/45012] Invalid ambiguity on partial class specialization matching
2010-07-21 2:43 [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching rodolfo at rodsoft dot org
` (2 preceding siblings ...)
2010-07-21 2:54 ` [Bug c++/45012] " pinskia at gmail dot com
@ 2010-07-21 3:03 ` rodolfo at rodsoft dot org
3 siblings, 0 replies; 5+ messages in thread
From: rodolfo at rodsoft dot org @ 2010-07-21 3:03 UTC (permalink / raw)
To: gcc-bugs
------- Comment #3 from rodolfo at rodsoft dot org 2010-07-21 03:03 -------
(In reply to comment #2)
> This enum value has an anonymous type which is not valid in the
> context of templates in C++03/98. It is valid in the current draft of C
> ++0x though. But I cannot remember if 4.5 implements that rule for -
> std=gnu++0x (-std=c++0x).
But I'm not using that anonymous type for template argument deduction (i.e.:
foo<bar<RUNTIME>,bar<RUNTIME>>), I'm just using in a comparison with an int.
But even if I turn it into a named type (i.e.: enum value_t { RUNTIME=-1 };),
it doesn't compile.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2010-07-21 3:03 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-07-21 2:43 [Bug c++/45012] New: Invalid ambiguity on partial class specialization matching rodolfo at rodsoft dot org
2010-07-21 2:49 ` [Bug c++/45012] " rodolfo at rodsoft dot org
2010-07-21 2:53 ` [Bug c++/45012] New: " Andrew Pinski
2010-07-21 2:54 ` [Bug c++/45012] " pinskia at gmail dot com
2010-07-21 3:03 ` rodolfo at rodsoft dot 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).