public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c++/40036]  New: Initializer incorrectly reordering arguments
@ 2009-05-06  4:08 jwbates at mac dot com
  2009-05-06  4:09 ` [Bug c++/40036] " jwbates at mac dot com
                   ` (5 more replies)
  0 siblings, 6 replies; 8+ messages in thread
From: jwbates at mac dot com @ 2009-05-06  4:08 UTC (permalink / raw)
  To: gcc-bugs

This bug was found with the following command-line option:

g++ -I ../../Headers -g -o Runtime0 Runtime0.cpp

It has appeared with all variations of the command-line that I have tried.

I'm building a fairly complex (all right, maybe a little insane) c++
template metaprogram to do efficient probabilistic inference. As a
part of that program, I am building expression classes to represent
intermediate calculations, preventing the overhead and extra
computation associated with temporary variables. So, for example,
multiplying three probabilistic potentials Pa, Pb, Pc is done by
creating an Expression<Expression<Pa, Multiply, Pb>, Multiply, Pc>.

The expression syntax that I have, while not robust enough to be a
general solution, correctly handles the cases that I need it to, as
verified by my unit tests. pabc = pa*pb*pc evaluates correctly when
written into a unit test.

But in order for this to be useful, I need the metaprogram to generate
the multiplication expression, and when I do so, I do *not* get the
correct results. I have run this code against gcc401, gcc43, and the
intel compiler, and only the intel compiler gets it right.

I have traced the incorrect results to one line of my code. At some
point, I have the constructor:

Expression(const Lhs & lhs, const Rhs & rhs) : _potentials(rhs,
lhs._potentials) {}

Notice that I swap rhs and lhs in the _potentials() initiator, for
proper evaluation ordering. When I look at this line in the debugger,
I see the correct types. 

But when I step into the _potentials constructor:

PotentialContainer(const ThisPotential & p, const ImportBase & others)
        : Base(others), _potential(p) {}

the argument "p" has the address of the "lhs" variable from the
preceding constructor, and "others" has the address of the "rhs"
variable. Furthermore, the types of the arguments are correct,
resulting in the "lhs" argument being treated as if it was a
ThisPotential type, and "rhs" being treated as an ImportBase, which
results in data being overwritten.

As per the gcc bug reporting instructions, I've included an
intermediate file (Runtime0.ii) for a debug build (or rather, I intend to...
where is the upload option in bugzilla?). I've tested on multiple
platforms and with several different argument lists, including fully
optimized, and no version of gcc/g++ that I have tried has handled this case
correctly. (Again, the intel compiler *does* work.)

The Expression() constructor in question is on line 20555 of the
Runtime0.ii file that I have enclosed.

Sadly, I haven't been able to find a simpler test case. Nor have I
found any workarounds.


-- 
           Summary: Initializer incorrectly reordering arguments
           Product: gcc
           Version: 4.3.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: jwbates at mac dot com
 GCC build triplet: i486-linux-gnu
  GCC host triplet: i486-linux-gnu
GCC target triplet: i486-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=40036


^ permalink raw reply	[flat|nested] 8+ messages in thread
[parent not found: <bug-40036-4@http.gcc.gnu.org/bugzilla/>]

end of thread, other threads:[~2012-01-19 23:29 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-05-06  4:08 [Bug c++/40036] New: Initializer incorrectly reordering arguments jwbates at mac dot com
2009-05-06  4:09 ` [Bug c++/40036] " jwbates at mac dot com
2009-05-06  5:02 ` pinskia at gcc dot gnu dot org
2009-05-06  5:25 ` jwbates at mac dot com
2009-05-06  6:09 ` pinskia at gcc dot gnu dot org
2009-05-06  6:40 ` jwbates at mac dot com
2009-05-26  5:26 ` jwbates at mac dot com
     [not found] <bug-40036-4@http.gcc.gnu.org/bugzilla/>
2012-01-19 23:39 ` 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).