[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