Bug 31407 - [4.3 Regression] undefined reference to `vtable for x'
Summary: [4.3 Regression] undefined reference to `vtable for x'
Status: RESOLVED INVALID
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.3.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-03-30 23:48 UTC by Martin Michlmayr
Modified: 2007-04-01 01:00 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Martin Michlmayr 2007-03-30 23:48:40 UTC
I'm not quite sure what's going on here.  *Maybe* this is invalid code, but
I belive it's a compiler bug because the error goes away when I remove completely
unrelated lines in the program.  Anyway, I get the following with 4.3 (it
compiles with 4.1):

(sid)6870:tbm@em64t: ~] g++ -c -g -O -o test.o test.cc
(sid)6871:tbm@em64t: ~] g++ -o x test.o
test.o: In function `Timer':
/home/tbm/timer.h:13: undefined reference to `vtable for Timer'
test.o: In function `Timer::timerEnd()':
/home/tbm/timer.h:20: undefined reference to `Timer::ttime() const'
test.o: In function `~Timer':
/home/tbm/timer.h:16: undefined reference to `vtable for Timer'
/home/tbm/timer.h:16: undefined reference to `vtable for Timer'
collect2: ld returned 1 exit status


test.cc:


#include "timer.h"
#include <getopt.h>
#include <string>

enum {O_ROW_PLOT, O_VERSION};

static struct option my_options[] =
{
  {"row-plot", 1, 0, O_ROW_PLOT},
  {"version", 0, 0, O_VERSION},
  {0, 0, 0, 0}
};

void test(double d) {
}

int main (int argc, char *const argv[])
{
  std::string strOutFile;
  Timer timerProgram;

  while (1) {
    char* endptr;
    int c = getopt_long (argc, argv, "", my_options, NULL);

    if (c == -1)
      break;

    switch (c) {
    case O_ROW_PLOT:
      strtol(optarg, &endptr, 10);
      break;
    case O_VERSION:
      return (0);

    }
  }

  test(timerProgram.timerEnd());

  return (0);
}


timer.h:


#ifndef _TIMER_H
#define _TIMER_H

#pragma interface "timer.h"

#include <cstdlib>
#include <sys/time.h>

class Timer
{
 public:
    Timer (void)
        {}

    ~Timer (void)
        {}

    virtual double timerEnd (void)
      {
        return ttime();
      }

 protected:
    double ttime(void) const
        {
            struct timeval now;
            gettimeofday (&now, NULL);
            return 0;
        }
};

#endif  // _TIMER_H
Comment 1 Andrew Pinski 2007-03-30 23:58:13 UTC
There is no `#pragma implementation ' so I don't think this is a bug.
Comment 2 Martin Michlmayr 2007-03-31 00:01:52 UTC
Any idea why it works when I remove completely unrelated lines, e.g.

    if (c == -1)
      break;

Is this just a coincidence?
Comment 3 Martin Michlmayr 2007-03-31 00:06:27 UTC
(In reply to comment #1)
> There is no `#pragma implementation ' so I don't think this is a bug.

This doesn't seem to help either.
Comment 4 Andreas Schwab 2007-03-31 08:56:43 UTC
You need to put it at the top of the file.
Comment 5 Martin Michlmayr 2007-03-31 10:22:33 UTC
(In reply to comment #4)
> You need to put it at the top of the file.

That works.  Still, a better diagnostic would be nice if that's possible.
Comment 6 Andrew Pinski 2007-04-01 01:00:45 UTC
Read:
http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/C_002b_002b-Interface.html


This is all documented there.  Really "#pragma interface"/"#pragma implementation" is useless for 99% of the code now adays because of comdat.  Yes people use older compilers but this is not our issue.