g++: M_PI is visible in conforming mode

Bug #1810695 reported by Keith Thompson
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
glibc (Ubuntu)
New
Undecided
Unassigned

Bug Description

The macro M_PI, which expands to a constant approximating the value
of pi, is defined by POSIX, but not by ISO C or ISO C++. It is
not a reserved identifier, so it should be available for use as a
user-defined identifier.

The problem: Including <cmath> causes M_PI to be defined, even when
the C++ compiler is invoked in what should be a conforming mode.

EXPECTED: Program compiles without error and prints "3".
OBSERVED: Program is rejected at compile time.

(The program is rejected when g++ or clang++ is invoked without
options. That's not a bug.)

Using <math.h> rather than <cmath> doesn't change the symptom.

A similar program in C does not exhibit the problem.

I *think* the problem is in the "math.h" header, which should arrange
for M_PI and similar macros not to be defined in conforming mode.
It's also possible that a fix might involve updates to g++ and/or
clang++. I haven't fully investigated the twisty maze of macro
definitions and nested #includes in math.h.

(I acknowledge that writing your own definition of M_PI is not a
good idea, and that the definition in this program is particularly
poor style.)

Output illustrating the problem follows:

$ lsb_release -rd
Description: Ubuntu 18.04.1 LTS
Release: 18.04

$ uname -a
Linux bomb20 4.15.0-42-generic #45-Ubuntu SMP Thu Nov 15 19:32:57 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

$ dpkg -l g++ clang libc6-dev:amd64 | grep '^ii'
ii clang 1:6.0-41~exp5~ubuntu1 amd64 C, C++ and Objective-C compiler (LLVM based)
ii g++ 4:7.3.0-3ubuntu2.1 amd64 GNU C++ compiler
ii libc6-dev:amd64 2.27-3ubuntu1 amd64 GNU C Library: Development Libraries and Header Files

$ g++ --version | head -1
g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

$ clang++ --version
clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin

$ cat M_PI_bug.cpp
#include <iostream>
#include <cmath>
int main() {
    const int M_PI = 22/7;
    std::cout << M_PI << '\n';
}

// This is not reasonable code.
// The issue is that a conforming C++ compiler must accept it.

// Expected output: 3

$ g++ -std=c++17 -pedantic-errors -c M_PI_bug.cpp
In file included from /usr/include/c++/7/cmath:45:0,
                 from M_PI_bug.cpp:2:
M_PI_bug.cpp: In function ‘int main()’:
M_PI_bug.cpp:4:15: error: expected unqualified-id before numeric constant
     const int M_PI = 22/7;
               ^

$ clang++ -std=c++17 -pedantic-errors -c M_PI_bug.cpp
M_PI_bug.cpp:4:15: error: expected unqualified-id
    const int M_PI = 22/7;
              ^
/usr/include/math.h:777:16: note: expanded from macro 'M_PI'
# define M_PI 3.14159265358979323846 /* pi */
                        ^
1 error generated.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.