Earl Chew wrote:
I can't make up my mind whether the new behaviour is incorrect, or whether the old behaviour should never have been supported.
I'm pretty certain this is a defect because I can construct a program that should work, but doesn't. In any case, I've discovered that this was an aberration of 4.1.0, and does not appear in later versions. Consider foo.cpp: namespace { extern const char f[]; } namespace { const char f[] = "abc"; } const char* g = f; Expect variable g to be global, but f to have non-global scope. 3.4.2 Pass 4.1.0 Fail 4.1.1 Pass 4.1.2 Fail ************************ 4.1.2 *************************************** ************************ PASS *************************************** .file "foo.cpp" .globl g .data .align 8 .type g, @object .size g, 8 g: .quad _ZN36_GLOBAL__N_foo.cpp_00000000_2B2B2FAE1fE .section .rodata .type _ZN36_GLOBAL__N_foo.cpp_00000000_2B2B2FAE1fE, @object .size _ZN36_GLOBAL__N_foo.cpp_00000000_2B2B2FAE1fE, 4 _ZN36_GLOBAL__N_foo.cpp_00000000_2B2B2FAE1fE: .string "abc" .ident "GCC: (GNU) 4.1.2 20070626 (Red Hat 4.1.2-14)" .section .note.GNU-stack,"",@progbits ************************ 4.1.1 *************************************** ************************ PASS *************************************** .file "foo.cpp" .globl g .data .align 4 .type g, @object .size g, 4 g: .long _ZN36_GLOBAL__N_foo.cpp_00000000_8E53D9441fE .section .rodata .type _ZN36_GLOBAL__N_foo.cpp_00000000_8E53D9441fE, @object .size _ZN36_GLOBAL__N_foo.cpp_00000000_8E53D9441fE, 4 _ZN36_GLOBAL__N_foo.cpp_00000000_8E53D9441fE: .string "abc" .ident "GCC: (GNU) 4.1.1 20070105 (Red Hat 4.1.1-51)" .section .note.GNU-stack,"",@progbits ************************ 4.1.0 *************************************** ************************ FAIL *************************************** .file "foo.cpp" .globl _ZN36_GLOBAL__N_foo.cpp_00000000_54D6CB4D1fE .section .rodata .type _ZN36_GLOBAL__N_foo.cpp_00000000_54D6CB4D1fE, @object .size _ZN36_GLOBAL__N_foo.cpp_00000000_54D6CB4D1fE, 4 _ZN36_GLOBAL__N_foo.cpp_00000000_54D6CB4D1fE: .string "abc" .globl g .data .align 4 .type g, @object .size g, 4 g: .long _ZN36_GLOBAL__N_foo.cpp_00000000_54D6CB4D1fE .ident "GCC: (GNU) 4.1.0" .section .note.GNU-stack,"",@progbits ************************ 3.4.2 *************************************** ************************ PASS *************************************** .file "foo.cpp" .globl _ZN36_GLOBAL__N_foo_cpp_00000000_4C2300AC1fE .section .rodata .align 2 .type _ZN36_GLOBAL__N_foo_cpp_00000000_4C2300AC1fE, @object .size _ZN36_GLOBAL__N_foo_cpp_00000000_4C2300AC1fE, 4 _ZN36_GLOBAL__N_foo_cpp_00000000_4C2300AC1fE: .string "abc" .globl g .section ".data" .align 2 .type g, @object .size g, 4 g: .long _ZN36_GLOBAL__N_foo_cpp_00000000_4C2300AC1fE .ident "GCC: (GNU) 3.4.2 (mingw-special)"