stephanemoore marked 2 inline comments as done.
stephanemoore added inline comments.
================
Comment at: clang-tidy/google/FunctionNamingCheck.cpp:96-97
// Match function declarations that are not in system headers and are not
// main.
Finder->addMatcher(
----------------
aaron.ballman wrote:
> This comment is drifting more and more out of sync with the code.
Good catch; updated the comment.
================
Comment at: test/clang-tidy/google-objc-function-naming.m:5-8
+static void TestImplicitlyDefinedFunction(int a) {
+ printf("%d", a);
+}
+
----------------
aaron.ballman wrote:
> Excuse my ignorance, but I don't see what about this function definition is
> testing an implicitly-defined function. Doesn't the `#import` above bring in
> the declaration for `printf()`, while `TestImplicitlyDefinedFunction()`
> itself is explicitly defined?
**tl;dr**: Yes, we have an explicit function declaration but clang generates an
implicit function declaration as well.
I found this surprising as well but the AST generated from this includes an
implicit function declaration. Even though we have an explicit function
declaration for `printf` from <stdio.h>, clang still generates an implicit
declaration of `printf` ๐คจ Similar behavior occurs with other functions, e.g.,
`memset` and various C11 atomic functions.
I have been spelunking in search of the reason but I do not have a full
understanding yet. I believe I have insight into the underlying mechanism
though: the behavior seems linked to builtin functions (e.g., `printf` is
declared as a builtin function
[here](https://github.com/llvm/llvm-project/blob/2946cd7/clang/include/clang/Basic/Builtins.def#L889)).
I have attached a small sample program and an associated AST dump below to
demonstrate the behavior.
โง
```
$ cat /tmp/test.c
extern int printf(const char *format, ...);
int main(int argc, const char **argv) {
printf("%d", argc);
return 0;
}
```
```
$ clang -cc1 -ast-dump /tmp/test.c
TranslationUnitDecl 0x561b9f7fe570 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x561b9f7feac0 <<invalid sloc>> <invalid sloc> implicit
__int128_t '__int128'
| `-BuiltinType 0x561b9f7fe7e0 '__int128'
|-TypedefDecl 0x561b9f7feb28 <<invalid sloc>> <invalid sloc> implicit
__uint128_t 'unsigned __int128'
| `-BuiltinType 0x561b9f7fe800 'unsigned __int128'
|-TypedefDecl 0x561b9f7fedf8 <<invalid sloc>> <invalid sloc> implicit
__NSConstantString 'struct __NSConstantString_tag'
| `-RecordType 0x561b9f7fec00 'struct __NSConstantString_tag'
| `-Record 0x561b9f7feb78 '__NSConstantString_tag'
|-TypedefDecl 0x561b9f7fee90 <<invalid sloc>> <invalid sloc> implicit
__builtin_ms_va_list 'char *'
| `-PointerType 0x561b9f7fee50 'char *'
| `-BuiltinType 0x561b9f7fe600 'char'
|-TypedefDecl 0x561b9f7ff158 <<invalid sloc>> <invalid sloc> implicit
__builtin_va_list 'struct __va_list_tag [1]'
| `-ConstantArrayType 0x561b9f7ff100 'struct __va_list_tag [1]' 1
| `-RecordType 0x561b9f7fef70 'struct __va_list_tag'
| `-Record 0x561b9f7feee0 '__va_list_tag'
|-FunctionDecl 0x561b9f851860 </tmp/test.c:1:12> col:12 implicit used printf
'int (const char *, ...)' extern
| |-ParmVarDecl 0x561b9f8518f8 <<invalid sloc>> <invalid sloc> 'const char *'
| `-FormatAttr 0x561b9f851960 <col:12> Implicit printf 1 2
|-FunctionDecl 0x561b9f8519b8 prev 0x561b9f851860 <col:1, col:42> col:12 used
printf 'int (const char *, ...)' extern
| |-ParmVarDecl 0x561b9f7ff1c0 <col:19, col:31> col:31 format 'const char *'
| `-FormatAttr 0x561b9f851a90 <col:12> Inherited printf 1 2
`-FunctionDecl 0x561b9f851c48 <line:3:1, line:6:1> line:3:5 main 'int (int,
const char **)'
|-ParmVarDecl 0x561b9f851ac8 <col:10, col:14> col:14 used argc 'int'
|-ParmVarDecl 0x561b9f851b70 <col:20, col:33> col:33 argv 'const char **'
`-CompoundStmt 0x561b9f851f08 <col:39, line:6:1>
|-CallExpr 0x561b9f851e50 <line:4:3, col:20> 'int'
| |-ImplicitCastExpr 0x561b9f851e38 <col:3> 'int (*)(const char *, ...)'
<FunctionToPointerDecay>
| | `-DeclRefExpr 0x561b9f851d58 <col:3> 'int (const char *, ...)' Function
0x561b9f8519b8 'printf' 'int (const char *, ...)'
| |-ImplicitCastExpr 0x561b9f851ea0 <col:10> 'const char *' <BitCast>
| | `-ImplicitCastExpr 0x561b9f851e88 <col:10> 'char *'
<ArrayToPointerDecay>
| | `-StringLiteral 0x561b9f851db8 <col:10> 'char [3]' lvalue "%d"
| `-ImplicitCastExpr 0x561b9f851eb8 <col:16> 'int' <LValueToRValue>
| `-DeclRefExpr 0x561b9f851de8 <col:16> 'int' lvalue ParmVar
0x561b9f851ac8 'argc' 'int'
`-ReturnStmt 0x561b9f851ef0 <line:5:3, col:10>
`-IntegerLiteral 0x561b9f851ed0 <col:10> 'int' 0
```
Note the presence of implicit and explicit declarations of `printf` in the AST
dump ๐ค
Repository:
rCTE Clang Tools Extra
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D57207/new/
https://reviews.llvm.org/D57207
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits