[Bug c++/45012] Invalid ambiguity on partial class specialization matching
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012 Ramana Radhakrishnan ramana at gcc dot gnu.org changed: What|Removed |Added CC||ramana at gcc dot gnu.org --- Comment #6 from Ramana Radhakrishnan ramana at gcc dot gnu.org 2011-11-17 16:03:34 UTC --- It was fixed actually by this commit . Author: jason Date: Tue Sep 27 02:13:00 2011 New Revision: 179230 URL: http://gcc.gnu.org/viewcvs?root=gccview=revrev=179230 Log: PR c++/45102 * pt.c (tsubst_copy_and_build) [CONST_DECL]: Don't pull out constant value if we're still in a template. Added: trunk/gcc/testsuite/g++.dg/template/partial13.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/pt.c trunk/gcc/testsuite/ChangeLog
[Bug c++/45012] Invalid ambiguity on partial class specialization matching
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012 Paolo Carlini paolo.carlini at oracle dot com changed: What|Removed |Added CC||potswa at mac dot com --- Comment #4 from Paolo Carlini paolo.carlini at oracle dot com 2011-09-26 18:28:15 UTC --- *** Bug 46105 has been marked as a duplicate of this bug. ***
[Bug c++/45012] Invalid ambiguity on partial class specialization matching
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45012 Jason Merrill jason at gcc dot gnu.org changed: What|Removed |Added Status|UNCONFIRMED |RESOLVED CC||jason at gcc dot gnu.org Resolution||FIXED AssignedTo|unassigned at gcc dot |jason at gcc dot gnu.org |gnu.org | Target Milestone|--- |4.7.0 Known to fail|| --- Comment #5 from Jason Merrill jason at gcc dot gnu.org 2011-09-27 02:22:29 UTC --- Fixed for 4.7.
[Bug c++/45012] Invalid ambiguity on partial class specialization matching
--- 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_iftrue,T { typedef T type; }; Of course, I forgot to add the error messages: teste.cpp:30: error: ambiguous class template instantiation for struct foobar2, bar2, void teste.cpp:19: error: candidates are: struct fooVM, VM, typename enable_if((M == RUNTIME) || (M == 2)), void::type teste.cpp:25: error: struct fooV1M, V2M, typename enable_if((M == RUNTIME) || (M == 2)), void::type teste.cpp:30: error: aggregate foobar2, bar2, 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
[Bug c++/45012] Invalid ambiguity on partial class specialization matching
--- 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-bugzi...@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 templateint class V, int M struct fooVM,VM, typename std::enable_ifM==RUNTIME || M==2::type {}; template templateint class V1, templateint class V2, int M struct fooV1M,V2M, typename std::enable_ifM==RUNTIME || M==2::type {}; template int M struct bar {}; foobar2,bar2 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
[Bug c++/45012] Invalid ambiguity on partial class specialization matching
--- 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.: foobarRUNTIME,barRUNTIME), 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