From 8a1d6a5eec8287729084e2a79b39fac96a9c75cd Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Tue, 11 Oct 2011 22:09:24 +0000 Subject: [PATCH] PR11062: Make C99 inlining work properly for names with associated builtin libcalls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@141723 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/Decl.cpp | 7 ++++++- test/CodeGen/inline.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/AST/Decl.cpp b/lib/AST/Decl.cpp index 5cd98584bf..3e5c253737 100644 --- a/lib/AST/Decl.cpp +++ b/lib/AST/Decl.cpp @@ -1856,7 +1856,12 @@ bool FunctionDecl::isInlineDefinitionExternallyVisible() const { // Only consider file-scope declarations in this test. if (!Redecl->getLexicalDeclContext()->isTranslationUnit()) continue; - + + // Only consider explicit declarations; the presence of a builtin for a + // libcall shouldn't affect whether a definition is externally visible. + if (Redecl->isImplicit()) + continue; + if (!Redecl->isInlineSpecified() || Redecl->getStorageClass() == SC_Extern) return true; // Not an inline definition } diff --git a/test/CodeGen/inline.c b/test/CodeGen/inline.c index 2f6bd72dab..6bc583df8c 100644 --- a/test/CodeGen/inline.c +++ b/test/CodeGen/inline.c @@ -15,7 +15,7 @@ // RUN: grep "define i32 @test6" %t // RUN: echo "\nC99 tests:" -// RUN: %clang %s -O1 -emit-llvm -S -o %t -std=c99 +// RUN: %clang %s -O1 -emit-llvm -S -o %t -std=gnu99 // RUN: grep "define i32 @ei()" %t // RUN: grep "define available_externally i32 @foo()" %t // RUN: grep "define i32 @bar()" %t @@ -29,6 +29,7 @@ // RUN: grep "define available_externally i32 @test4" %t // RUN: grep "define available_externally i32 @test5" %t // RUN: grep "define i32 @test6" %t +// RUN: grep "define available_externally i.. @strlcpy" %t // RUN: echo "\nC++ tests:" // RUN: %clang -x c++ %s -O1 -emit-llvm -S -o %t -std=c++98 @@ -97,3 +98,7 @@ extern int test6(); // redeclaration detection. void test7() { } void test7(); + +// PR11062; the fact that the function is named strlcpy matters here. +inline __typeof(sizeof(int)) strlcpy(char *dest, const char *src, __typeof(sizeof(int)) size) { return 3; } +void test8() { strlcpy(0,0,0); } -- 2.40.0