diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp index 6b864d0f0ac2..88f6bfba0241 100644 --- a/clang/lib/AST/ASTContext.cpp +++ b/clang/lib/AST/ASTContext.cpp @@ -876,6 +876,8 @@ RecordDecl *ASTContext::buildImplicitRecord(StringRef Name, NewDecl = RecordDecl::Create(*this, TK, getTranslationUnitDecl(), Loc, Loc, &Idents.get(Name)); NewDecl->setImplicit(); + NewDecl->addAttr(TypeVisibilityAttr::CreateImplicit( + const_cast(*this), TypeVisibilityAttr::Default)); return NewDecl; } diff --git a/clang/test/CodeGenCXX/implicit-record-visibility.cpp b/clang/test/CodeGenCXX/implicit-record-visibility.cpp new file mode 100644 index 000000000000..701a2031edf5 --- /dev/null +++ b/clang/test/CodeGenCXX/implicit-record-visibility.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 %s -I%S -fvisibility hidden -triple x86_64-linux-gnu -emit-llvm -o - | FileCheck %s + +#include +#include + +// If struct __va_list_tag did not explicitly have default visibility, then +// under -fvisibility hidden the type of function f, due to its va_list (aka +// __builtin_va_list, aka __va_list_tag (*)[1]) parameter would be hidden: + +// CHECK: @_ZTSFvP13__va_list_tagE = linkonce_odr constant +// CHECK: @_ZTIFvP13__va_list_tagE = linkonce_odr constant +void f(va_list) { (void)typeid(f); }