]> granicus.if.org Git - clang/commitdiff
really fix 6473 by handling weakref in constant expressions.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 4 Mar 2010 21:26:03 +0000 (21:26 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 4 Mar 2010 21:26:03 +0000 (21:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97750 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGExprConstant.cpp
test/CodeGen/attr-weakref.c

index 3df552d75bb6d26c06498fbe86907808d1d1572b..f0d82a8f0dc6d0a9478fdc941361644e7a751e46 100644 (file)
@@ -761,7 +761,9 @@ public:
       return C;
     }
     case Expr::DeclRefExprClass: {
-      NamedDecl *Decl = cast<DeclRefExpr>(E)->getDecl();
+      ValueDecl *Decl = cast<DeclRefExpr>(E)->getDecl();
+      if (Decl->hasAttr<WeakRefAttr>())
+       return CGM.GetWeakRefReference(Decl);
       if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(Decl))
         return CGM.GetAddrOfFunction(FD);
       if (const VarDecl* VD = dyn_cast<VarDecl>(Decl)) {
index 06185e8e34ee7e4e7be7b465005cc3facd193ff2..c1cc03b668d999d95910c2f72c578b86671df106 100644 (file)
@@ -52,3 +52,11 @@ void test6_h(void) {
 void test6_foo(void) {
   test6_f();
 }
+
+// CHECK: declare extern_weak void @test7_f()
+void test7_f(void);
+static void test7_g(void) __attribute__((weakref("test7_f")));
+static void *const test7_zed = (void *) &test7_g;
+void* test7_h(void) {
+  return test7_zed;
+}