summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2015-12-03 11:37:28 +0000
committerAlexander Kornienko <alexfh@google.com>2015-12-03 11:37:28 +0000
commit061900fea81c9439918467d16fcb0bfb0bcb5dc8 (patch)
tree9ae5e196a47c00d7de6c56b3f284c1a6567d0856
parentab43f42d9ced5b604ae9241fb02f12dc30f65556 (diff)
downloadbcm5719-llvm-061900fea81c9439918467d16fcb0bfb0bcb5dc8.tar.gz
bcm5719-llvm-061900fea81c9439918467d16fcb0bfb0bcb5dc8.zip
Revert "Fix for merging decls in pragma weak Calling CheckFunctionDeclaration so that 2 decls for the 'weak' are merged. Differential Revision: http://reviews.llvm.org/D13048"
This reverts commit r254143 which introduces a crash on the following input: f(char *); g(char *); #pragma weak f = g int g(char *p) {} llvm-svn: 254605
-rw-r--r--clang/lib/Sema/SemaDeclAttr.cpp21
-rw-r--r--clang/test/CodeGen/pragma-weak.c9
-rw-r--r--clang/test/Sema/pragma-weak.c6
3 files changed, 8 insertions, 28 deletions
diff --git a/clang/lib/Sema/SemaDeclAttr.cpp b/clang/lib/Sema/SemaDeclAttr.cpp
index fed22c934ce..5a0f0f84af7 100644
--- a/clang/lib/Sema/SemaDeclAttr.cpp
+++ b/clang/lib/Sema/SemaDeclAttr.cpp
@@ -5546,22 +5546,17 @@ NamedDecl * Sema::DeclClonePragmaWeak(NamedDecl *ND, IdentifierInfo *II,
assert(isa<FunctionDecl>(ND) || isa<VarDecl>(ND));
NamedDecl *NewD = nullptr;
if (FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
+ FunctionDecl *NewFD;
+ // FIXME: Missing call to CheckFunctionDeclaration().
// FIXME: Mangling?
// FIXME: Is the qualifier info correct?
// FIXME: Is the DeclContext correct?
-
- LookupResult Previous(*this, II, Loc, LookupOrdinaryName);
- LookupParsedName(Previous, TUScope, nullptr, true);
-
- auto NewFD = FunctionDecl::Create(
- FD->getASTContext(), FD->getDeclContext(), Loc, Loc,
- DeclarationName(II), FD->getType(), FD->getTypeSourceInfo(), SC_None,
- false /*isInlineSpecified*/, FD->hasPrototype(),
- false /*isConstexprSpecified*/);
-
- CheckFunctionDeclaration(TUScope, NewFD, Previous,
- false /*IsExplicitSpecialization*/);
-
+ NewFD = FunctionDecl::Create(FD->getASTContext(), FD->getDeclContext(),
+ Loc, Loc, DeclarationName(II),
+ FD->getType(), FD->getTypeSourceInfo(),
+ SC_None, false/*isInlineSpecified*/,
+ FD->hasPrototype(),
+ false/*isConstexprSpecified*/);
NewD = NewFD;
if (FD->getQualifier())
diff --git a/clang/test/CodeGen/pragma-weak.c b/clang/test/CodeGen/pragma-weak.c
index e63277fc230..36abca5de32 100644
--- a/clang/test/CodeGen/pragma-weak.c
+++ b/clang/test/CodeGen/pragma-weak.c
@@ -17,7 +17,6 @@
// CHECK-DAG: @mix2 = weak alias void (), void ()* @__mix2
// CHECK-DAG: @a1 = weak alias void (), void ()* @__a1
// CHECK-DAG: @xxx = weak alias void (), void ()* @__xxx
-// CHECK-DAG: @weakfoo = weak alias void {{.*}} @localfoo
@@ -174,14 +173,6 @@ label:
// CHECK: declare extern_weak i32 @PR16705b()
// CHECK: declare extern_weak i32 @PR16705c()
-// In this test case, we have a declaration of weakfoo before #pragma weak.
-// Test that 2 decls for the weakfoo are merged.
-extern void weakfoo();
-void localfoo() { }
-#pragma weak weakfoo=localfoo
-extern void externmain() { return weakfoo(); }
-// CHECK-LABEL: define void @externmain()
-// CHECK: call{{.*}}@weakfoo
///////////// TODO: stuff that still doesn't work
diff --git a/clang/test/Sema/pragma-weak.c b/clang/test/Sema/pragma-weak.c
index 031e78f15ff..c14125eac9f 100644
--- a/clang/test/Sema/pragma-weak.c
+++ b/clang/test/Sema/pragma-weak.c
@@ -9,9 +9,3 @@ void __a3(void) __attribute((noinline));
#pragma weak a3 = __a3 // expected-note {{previous definition}}
void a3(void) __attribute((alias("__a3"))); // expected-error {{redefinition of 'a3'}}
void __a3(void) {}
-
-extern void weak2foo(int); // expected-note {{previous declaration is here}} expected-note {{'weak2foo' declared here}}
-void local2foo(double d1, double d2) { }
-#pragma weak weak2foo=local2foo // expected-error {{conflicting types for 'weak2foo'}}
-extern void extern2main() { return weak2foo(); } // expected-error {{too few arguments to function call, expected 1, have 0}}
-
OpenPOWER on IntegriCloud