[llvm-bugs] [Bug 33224] New: clang places implicitly declared C functions at compile unit scope
via llvm-bugs
llvm-bugs at lists.llvm.org
Tue May 30 06:52:30 PDT 2017
https://bugs.llvm.org/show_bug.cgi?id=33224
Bug ID: 33224
Summary: clang places implicitly declared C functions at
compile unit scope
Product: clang
Version: trunk
Hardware: All
OS: All
Status: NEW
Severity: enhancement
Priority: P
Component: Frontend
Assignee: unassignedclangbugs at nondot.org
Reporter: momchil.velikov at arm.com
CC: llvm-bugs at lists.llvm.org
Created attachment 18537
--> https://bugs.llvm.org/attachment.cgi?id=18537&action=edit
testcase
Compiling the following testcase with `clang -std=c90 -c x.c`
> int f() {
> g();
> return 0;
> }
>
> int (*p)() = g;
completes successfully.
The identifier `g` is not declared at the place, where it appears in the
context of the function call expression. In that case, the C90 Standard says
(6.3.3.2 Function calls):
> If the expression that precedes the parenthesized argument list in a function
> call consists solely by an identifier, and if no declaration is visible for this
> identifier, the identifier is implicitly declared as if, in the innermost block
> containing the function call, the declaration
>
> extern int identifier();
>
> appeared.
Therefore, the above program should be equivalent to:
> int f() {
> extern int g();
> g();
> return 0;
> }
>
> int (*p)() = g;
for which clang terminates with an error. The C90 Standard (6.1.2.1 Scopes of
identifiers), says:
> If the declarator or type specifier that declared the identifier appears inside a block [...],
> the identifier has block scope, which terminates at the } that closes the associated block.
so, this should be the correct behavior in both testcases.
However, clang places the implicitly declared function at translation
unit scope, which causes the identifier to be visible in the initializer
in the original testcase, in effect accepting an invalid program.
--
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/20170530/e9dfb31e/attachment.html>
More information about the llvm-bugs
mailing list