Pull in r201130 from upstream clang trunk (by Ted Kremenek): Fix PCH deserialization bug with local static symbols being treated as local extern. This triggered a miscompilation of code using Boost's function_template.hpp when it was included inside a PCH file. A local static within that header would be treated as local extern, resulting in the wrong mangling. This only occurred during PCH deserialization. Fixes and . This fixes a crash in audio/murmur, which is using both PCH and Boost. Introduced here: http://svnweb.freebsd.org/changeset/base/278788 Index: tools/clang/lib/Serialization/ASTReaderDecl.cpp =================================================================== --- tools/clang/lib/Serialization/ASTReaderDecl.cpp +++ tools/clang/lib/Serialization/ASTReaderDecl.cpp @@ -971,7 +971,7 @@ ASTDeclReader::RedeclarableResult ASTDeclReader::V VD->setCachedLinkage(VarLinkage); // Reconstruct the one piece of the IdentifierNamespace that we need. - if (VarLinkage != NoLinkage && + if (VD->getStorageClass() == SC_Extern && VarLinkage != NoLinkage && VD->getLexicalDeclContext()->isFunctionOrMethod()) VD->setLocalExternDecl(); Index: tools/clang/test/PCH/local_static.cpp =================================================================== --- tools/clang/test/PCH/local_static.cpp +++ tools/clang/test/PCH/local_static.cpp @@ -0,0 +1,20 @@ +// Test this without PCH. +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -include %S/local_static.h -fsyntax-only %s -emit-llvm -o %t.no_pch.ll %s +// RUN: FileCheck --input-file %t.no_pch.ll %s + +// Test with PCH. +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -x c++-header -emit-pch -o %t.pch %S/local_static.h +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.9.0 -include-pch %t.pch -emit-llvm -o %t.pch.ll %s +// RUN: FileCheck --input-file %t.pch.ll %s + +void test(Bar &b) { + b.f(); + static int s; +} + +// Check if the mangling of static and local extern variables +// are correct and preserved by PCH. + +// CHECK: @_ZZ4testR3BarE1s = internal global i32 0, align 4 +// CHECK: @_ZZN3Bar1fIiEEvvE1y = linkonce_odr constant i32 0, align 4 + Index: tools/clang/test/PCH/local_static.h =================================================================== --- tools/clang/test/PCH/local_static.h +++ tools/clang/test/PCH/local_static.h @@ -0,0 +1,7 @@ +class Bar { +public: + template + void f() { + static const T y = 0; + } +};