анонимные пространства имен и одно определение правила

Нарушаю ли я правило единого определения в следующей программе?

// foo.hpp
#ifndef FOO_HPP_
#define FOO_HPP_

namespace {
   inline int foo() {
       return 1;
   }
}

inline int bar() {
    return foo();
}
#endif
//EOF

а также

// m1.cpp

#include "foo.hpp"

int m1() {
    return bar();
}

//EOF

а также

// m2.cpp

#include "foo.hpp"

int m2() {
    return bar();
}

//EOF

и наконец

// main.cpp
#include <iostream>

int m1();
int m2();

int main(int, const char* [])
{
    int i = m1();
    int j = m2();

    std::cout << (i+j) << std::endl;
    return 0;
}

// EOF

Обратите внимание на то, чтоfoo()&nbsp;определяется в анонимном пространстве имен, поэтому я ожидаю, что каждая единица переводаm1.cpp&nbsp;а такжеm2.cpp&nbsp;получит собственную версию, поэтому нарушения ODR нет. С другой стороны,bar()&nbsp;это просто старая встроенная функция, которая вызывает 2 разныхfoos. Так что это нарушает ODR, верно?

Обновить:&nbsp;Ранее у меня были макросы в определенииfoo&nbsp;что изменило возвращаемое значение и каждый изm1&nbsp;а такжеm2&nbsp;определил макрос по-разному перед включениемfoo.hpp, (И с этим предыдущим примером,g++&nbsp;будет производить двоичный файл, который выводит(i+j)&nbsp;со значением, отличным от того, что вы ожидаете.)Но на самом деле эта программа нарушает ODR, даже если телоfoo()&nbsp;идентичен