[llvm-bugs] [Bug 41921] New: “extern int i;” declaration inside function is allowed to shadow “static int i;” at file scope despite automatic variable “i” in function

via llvm-bugs llvm-bugs at lists.llvm.org
Fri May 17 02:42:35 PDT 2019


https://bugs.llvm.org/show_bug.cgi?id=41921

            Bug ID: 41921
           Summary: “extern int i;” declaration inside function is allowed
                    to shadow “static int i;” at file scope despite
                    automatic variable “i” in function
           Product: clang
           Version: 8.0
          Hardware: PC
                OS: All
            Status: NEW
          Severity: normal
          Priority: P
         Component: Frontend
          Assignee: unassignedclangbugs at nondot.org
          Reporter: cuoq at trust-in-soft.com
                CC: llvm-bugs at lists.llvm.org, neeilans at live.com,
                    richard-llvm at metafoo.co.uk

This report is related to but different from
https://bugs.llvm.org/show_bug.cgi?id=3645

The C program below is accepted by Clang 8.0.0 and compiled to the obvious
result (p1 and p2 are equal after the execution of f()).
__________

int *p1, *p2;

static int i = 1;

void f(void) {
    p1 = &i;
    int i = 2;
    {
        extern int i;
        p2 = &i;
    }
}
__________

Compiler Explorer link: https://gcc.godbolt.org/z/mVK_8H

You may notice in the link that GCC rejects this same C program BECAUSE of the
line “int i = 2;” (changing i to j in this line makes GCC accept it)

Joseph Myers says that rejecting this program when f() declares the automatic
variable “i” is on purpose and is what the C standard intends:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90472#c3

Joseph's argument is (I think) that in the C11 clause 6.2.2:4
(https://port70.net/~nsz/c/c11/n1570.html#6.2.2p4 and quoted below), the part
that makes the program valid without the automatic variable “i” does not apply
to this program because the static variable “i” is not “visible”, being hidden
by the automatic variable “i”. I have to admit that footnote 31 appears to make
his interpretation correct.
__________

For an identifier declared with the storage-class specifier extern in a scope
in which a prior declaration of that identifier is visible,31) if the prior
declaration specifies internal or external linkage, the linkage of the
identifier at the later declaration is the same as the linkage specified at the
prior declaration. If no prior declaration is visible, or if the prior
declaration specifies no linkage, then the identifier has external linkage.


footnote 31) As specified in 6.2.1, the later declaration might hide the prior
declaration.
___________

If you disagree with Joseph's interpretation, I can attempt to file a DR for
clarification of this part of the C standard.

-- 
You are receiving this mail because:
You are on the CC list for the bug.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-bugs/attachments/20190517/0b7cc287/attachment.html>


More information about the llvm-bugs mailing list