AST: Properly calculate the linkage of a IndirectFieldDecl
authorDavid Majnemer <david.majnemer@gmail.com>
Wed, 10 Dec 2014 22:58:14 +0000 (22:58 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Wed, 10 Dec 2014 22:58:14 +0000 (22:58 +0000)
getLVForNamespaceScopeDecl believed that it wasn't possible for it to
ever see an IndirectFieldDecl.  However, this can occur when determining
whether or not something is a redeclaration of a member of an anonymous
static union.

This fixes PR21858.

llvm-svn: 223975

clang/lib/AST/Decl.cpp
clang/test/SemaCXX/anonymous-union.cpp

index a937fdf..3e398ae 100644 (file)
@@ -619,9 +619,12 @@ static LinkageInfo getLVForNamespaceScopeDecl(const NamedDecl *D,
     // Explicitly declared static.
     if (Function->getCanonicalDecl()->getStorageClass() == SC_Static)
       return LinkageInfo(InternalLinkage, DefaultVisibility, false);
+  } else if (const auto *IFD = dyn_cast<IndirectFieldDecl>(D)) {
+    //   - a data member of an anonymous union.
+    const VarDecl *VD = IFD->getVarDecl();
+    assert(VD && "Expected a VarDecl in this IndirectFieldDecl!");
+    return getLVForNamespaceScopeDecl(VD, computation);
   }
-  //   - a data member of an anonymous union.
-  assert(!isa<IndirectFieldDecl>(D) && "Didn't expect an IndirectFieldDecl!");
   assert(!isa<FieldDecl>(D) && "Didn't expect a FieldDecl!");
 
   if (D->isInAnonymousNamespace()) {
index fde27b0..3b568fd 100644 (file)
@@ -84,6 +84,10 @@ static union {
   float float_val2;
 };
 
+void PR21858() {
+  void int_val2();
+}
+
 void f() {
   int_val2 = 0;
   float_val2 = 0.0;