g++ ignores inline keyword (odr) unless diagnostic, optimizer or standard flags are given?

Viewed 29

I have these three files:

test.h

inline int foo(int i) {
    return i;
}

asdf1.cpp

#include "test.h"

int main () {
}

asdf2.cpp

#include "test.h"

int bar () {
    return 42;
}

When compiling with g++ asdf1.cpp asdf2.cpp, this happens:

$ g++ asdf1.cpp asdf2.cpp
/usr/bin/ld: /tmp/ccTPkxPK.o: in function `foo(int)':
asdf2.cpp:(.text+0x0): multiple definition of `foo(int)'; /tmp/ccJLbLeL.o:asdf1.cpp:(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
$ g++ asdf1.cpp asdf2.cpp -O1
$ g++ asdf1.cpp asdf2.cpp -Wpedantic
$ g++ asdf1.cpp asdf2.cpp -std=c++14
$ # all of the above work

Why does g++ ignore the inline keyword unless some unrelated flag is given?

Especially weird since, with the -v flag, g++ tells me that it's using c++14 even when nothing is specified. Also, as far as I'm aware, the inline keyword (in this usage) exists in every C++ standard.

0 Answers
Related