-
Notifications
You must be signed in to change notification settings - Fork 11.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix bug that undefined internal is a warning only for -pedantic-errors (
#98016) This fixes issue #39558 which mentions the problem when compiling the following code with `-pedantic-errors` flag (it also mentions `-Wall -Wextra` but those shouldn't change the output, which is also the case in GCC): ```c static void f(); int main() { f; } ``` Clang only outputs an `undefined-internal` warning on the first line, but according to 6.9/3 ``` "... Moreover, if an identifier declared with internal linkage is used in an expression (other than as a part of the operand of a sizeof or _Alignof operator whose result is an integer constant), there shall be exactly one external definition for the identifier in the translation unit." ``` this should be illegal and hence an error. I fixed this by changing the warning type from `Warning` to `ExtWarn` and by adding a suitable test.
- Loading branch information
1 parent
9ddfe62
commit e16882f
Showing
4 changed files
with
43 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
// RUN: %clang_cc1 -fsyntax-only -verify %s -Wno-pointer-arith -Wno-gnu-alignof-expression -Wno-unused -pedantic-errors | ||
|
||
static void *a(void); // expected-error {{function 'a' has internal linkage but is not defined}} | ||
static void *b(void); // expected-error {{function 'b' has internal linkage but is not defined}} | ||
static void *c(void); // expected-error {{function 'c' has internal linkage but is not defined}} | ||
static void *d(void); // expected-error {{function 'd' has internal linkage but is not defined}} | ||
static void *no_err(void); | ||
|
||
int main(void) | ||
{ | ||
a; // expected-note {{used here}} | ||
|
||
int i = _Alignof(no_err); | ||
|
||
int j = _Generic(&no_err, void *(*)(void): 0); | ||
|
||
void *k = _Generic(&no_err, void *(*)(void): b(), default: 0); // expected-note {{used here}} | ||
|
||
// FIXME according to the C standard there should be no error if the undefined internal is | ||
// "part of the expression in a generic association that is not the result expression of its generic selection;" | ||
// but, currently, clang wrongly emits an error in this case | ||
k = _Generic(&no_err, void *(*)(void): 0, default: c()); // expected-note {{used here}} | ||
|
||
k = _Generic(&no_err, int (*)(void) : 0, default : d()); // expected-note {{used here}} | ||
|
||
int l = sizeof(no_err); | ||
|
||
__typeof__(&no_err) x; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
// RUN: %clang_cc1 -fsyntax-only -verify %s -std=c23 -pedantic-errors | ||
|
||
// expected-no-diagnostics | ||
|
||
static int f(void); | ||
|
||
int main(void) | ||
{ | ||
typeof(&f) x; | ||
} |