From 1410004f9e314b128c9450b65b39f83a8b7a61dd Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 15 Jan 2015 08:41:25 +0000 Subject: [PATCH] AST: Ensure implicit records have default visibility Types composed with certain implicit record types would have their RTTI marked as hidden because the implicit record type didn't have any visibility. This manifests itself as triggering false positives from tools like clang's -fsantize=function feature. The RTTI for a function type's return type wouldn't match if the return type was an implicit record type. Patch by Stephan Bergmann! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226148 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/ASTContext.cpp | 2 ++ test/CodeGenCXX/implicit-record-visibility.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 test/CodeGenCXX/implicit-record-visibility.cpp diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index 6b864d0f0a..88f6bfba02 100644 --- a/lib/AST/ASTContext.cpp +++ b/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/test/CodeGenCXX/implicit-record-visibility.cpp b/test/CodeGenCXX/implicit-record-visibility.cpp new file mode 100644 index 0000000000..701a2031ed --- /dev/null +++ b/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); } -- 2.40.0