diff --git a/clang/lib/AST/ASTImporter.cpp b/clang/lib/AST/ASTImporter.cpp --- a/clang/lib/AST/ASTImporter.cpp +++ b/clang/lib/AST/ASTImporter.cpp @@ -4018,6 +4018,7 @@ D->getStorageClass())) return ToVar; + ToVar->setTSCSpec(D->getTSCSpec()); ToVar->setQualifierInfo(ToQualifierLoc); ToVar->setAccess(D->getAccess()); ToVar->setLexicalDeclContext(LexicalDC); diff --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp --- a/clang/unittests/AST/ASTImporterTest.cpp +++ b/clang/unittests/AST/ASTImporterTest.cpp @@ -3480,6 +3480,20 @@ struct ImportVariables : ASTImporterOptionSpecificTestBase {}; +TEST_P(ImportVariables, ImportedVarDeclPreservesThreadLocalStorage) { + Decl *FromTU = + getTuDecl("thread_local int declToImport;", Lang_CXX11, "input1.cc"); + + auto *FromDWithTLS = FirstDeclMatcher().match( + FromTU, varDecl(hasThreadStorageDuration())); + ASSERT_TRUE(FromDWithTLS); + ASSERT_EQ(SD_Thread, FromDWithTLS->getStorageDuration()); + + const auto *ToD = Import(FromDWithTLS, Lang_CXX11); + ASSERT_TRUE(ToD); + EXPECT_EQ(SD_Thread, ToD->getStorageDuration()); +} + TEST_P(ImportVariables, ImportOfOneDeclBringsInTheWholeChain) { Decl *FromTU = getTuDecl( R"(