Attached patch attempts to fix an IRGen crash caused by treating local
redeclaration of a built-in function as a
built-in. This patch removes an exception where the AST node for local
redeclaration of built-in function
remains built-in. This causes the IRGen to treat the call to this function as
built-in call resulting in crash.
Patch removes this exception, but also makes the implicit declaration of the
built-in function as invalid.
Please review.
- Fariborz
Index: lib/Sema/SemaDecl.cpp
===================================================================
--- lib/Sema/SemaDecl.cpp (revision 209303)
+++ lib/Sema/SemaDecl.cpp (working copy)
@@ -2748,18 +2748,13 @@
Diag(New->getLocation(), diag::warn_redecl_library_builtin) << New;
Diag(OldLocation, diag::note_previous_builtin_declaration)
<< Old << Old->getType();
+ // New user declared function is overriding the built-in. Not only
+ // forget about its "builtin-ness", but also make the impliclitly
+ // declared built-in function invalid; otherwise, We have a built-in
+ // declaration AST whose Identifier is Builtin::NotBuiltin.
+ New->getIdentifier()->setBuiltinID(Builtin::NotBuiltin);
+ Old->setInvalidDecl();
- // If this is a global redeclaration, just forget hereafter
- // about the "builtin-ness" of the function.
- //
- // Doing this for local extern declarations is problematic. If
- // the builtin declaration remains visible, a second invalid
- // local declaration will produce a hard error; if it doesn't
- // remain visible, a single bogus local redeclaration (which is
- // actually only a warning) could break all the downstream code.
- if (!New->getLexicalDeclContext()->isFunctionOrMethod())
- New->getIdentifier()->setBuiltinID(Builtin::NotBuiltin);
-
return false;
}
Index: test/CodeGen/locally-redeclared-builtin-call.c
===================================================================
--- test/CodeGen/locally-redeclared-builtin-call.c (revision 0)
+++ test/CodeGen/locally-redeclared-builtin-call.c (working copy)
@@ -0,0 +1,17 @@
+// RUN: %clang_cc1 -emit-llvm -o - %s | FileCheck %s
+// rdar://16897451
+
+int Test()
+{
+ int a,b;
+ int pow (int,int);
+ return pow(a,b);
+}
+// CHECK-NOT: call i32 @llvm.pow.i32
+// CHECK: [[CALL:%.*]] = call i32 @pow(i32 %0, i32 %1)
+// ret i32 [[CALL]]
+
+int pow(int c,int d)
+{
+ return c*d;
+}
Index: test/Sema/extern-redecl.c
===================================================================
--- test/Sema/extern-redecl.c (revision 209303)
+++ test/Sema/extern-redecl.c (working copy)
@@ -49,12 +49,12 @@
extern float *calloc(); // expected-warning {{incompatible redeclaration of
library function}} expected-note {{is a builtin}} expected-note 2 {{previous
declaration is here}}
void test5a() {
int abort(); // expected-error {{conflicting types}}
- float *malloc(); // expected-warning {{incompatible redeclaration of library
function}} expected-note 2 {{is a builtin}}
+ float *malloc(); // expected-warning {{incompatible redeclaration of library
function}} expected-note {{is a builtin}}
int *calloc(); // expected-error {{conflicting types}}
}
void test5b() {
int abort(); // expected-error {{conflicting types}}
- float *malloc(); // expected-warning {{incompatible redeclaration of library
function}}
+ float *malloc();
int *calloc(); // expected-error {{conflicting types}}
}
void test5c() {
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits