[clang-format] Fix regression when getStyle() called with empty filename
Summary: D43522 caused an assertion failure when getStyle() was called with an empty filename: P8065 This adds a test to reproduce the failure and fixes the issue by ensuring we never pass an empty filename to Environment::CreateVirtualEnvironment(). Test Plan: New test added. Ran test with: % make -j12 FormatTests && ./tools/clang/unittests/Format/FormatTests Before diff, test failed with P8065. Now, test passes. Reviewers: vsapsai, jolesiak, krasimir Reviewed By: vsapsai Subscribers: klimek, cfe-commits Differential Revision: https://reviews.llvm.org/D43590 llvm-svn: 325722
This commit is contained in:
parent
e075709b41
commit
07e5836521
|
@ -2297,12 +2297,13 @@ static FormatStyle::LanguageKind getLanguageByFileName(StringRef FileName) {
|
|||
FormatStyle::LanguageKind guessLanguage(StringRef FileName, StringRef Code) {
|
||||
FormatStyle::LanguageKind result = getLanguageByFileName(FileName);
|
||||
if (result == FormatStyle::LK_Cpp) {
|
||||
auto extension = llvm::sys::path::extension(FileName);
|
||||
auto Extension = llvm::sys::path::extension(FileName);
|
||||
// If there's no file extension (or it's .h), we need to check the contents
|
||||
// of the code to see if it contains Objective-C.
|
||||
if (extension.empty() || extension == ".h") {
|
||||
if (Extension.empty() || Extension == ".h") {
|
||||
auto NonEmptyFileName = FileName.empty() ? "guess.h" : FileName;
|
||||
std::unique_ptr<Environment> Env =
|
||||
Environment::CreateVirtualEnvironment(Code, FileName, /*Ranges=*/{});
|
||||
Environment::CreateVirtualEnvironment(Code, NonEmptyFileName, /*Ranges=*/{});
|
||||
ObjCHeaderStyleGuesser Guesser(*Env, getLLVMStyle());
|
||||
Guesser.process();
|
||||
if (Guesser.isObjC()) {
|
||||
|
|
|
@ -11723,6 +11723,12 @@ TEST_F(FormatTest, NoSpaceAfterSuper) {
|
|||
verifyFormat("__super::FooBar();");
|
||||
}
|
||||
|
||||
TEST(FormatStyle, GetStyleWithEmptyFileName) {
|
||||
auto Style1 = getStyle("file", "", "Google");
|
||||
ASSERT_TRUE((bool)Style1);
|
||||
ASSERT_EQ(*Style1, getGoogleStyle());
|
||||
}
|
||||
|
||||
TEST(FormatStyle, GetStyleOfFile) {
|
||||
vfs::InMemoryFileSystem FS;
|
||||
// Test 1: format file in the same directory.
|
||||
|
|
Loading…
Reference in New Issue