From 12b5e1997d34b66062de7accc3a58429d5b8af51 Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Wed, 5 Mar 2014 20:55:36 +0000 Subject: [PATCH] When building a module from the command line via -emit-module, add an entry to the module build stack for the module being built, so we can correctly detect recursive module builds. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@203006 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Frontend/DiagnosticRenderer.cpp | 7 +++++-- lib/Frontend/FrontendActions.cpp | 10 +++++++++- test/Modules/recursive.c | 4 ++-- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/lib/Frontend/DiagnosticRenderer.cpp b/lib/Frontend/DiagnosticRenderer.cpp index 4eee59548c..b52f0103e6 100644 --- a/lib/Frontend/DiagnosticRenderer.cpp +++ b/lib/Frontend/DiagnosticRenderer.cpp @@ -499,8 +499,11 @@ DiagnosticNoteRenderer::emitBuildingModuleLocation(SourceLocation Loc, // Generate a note indicating the include location. SmallString<200> MessageStorage; llvm::raw_svector_ostream Message(MessageStorage); - Message << "while building module '" << ModuleName << "' imported from " - << PLoc.getFilename() << ':' << PLoc.getLine() << ":"; + if (PLoc.getFilename()) + Message << "while building module '" << ModuleName << "' imported from " + << PLoc.getFilename() << ':' << PLoc.getLine() << ":"; + else + Message << "while building module '" << ModuleName << ":"; emitNote(Loc, Message.str(), &SM); } diff --git a/lib/Frontend/FrontendActions.cpp b/lib/Frontend/FrontendActions.cpp index f587d829b3..4ed2df3a25 100644 --- a/lib/Frontend/FrontendActions.cpp +++ b/lib/Frontend/FrontendActions.cpp @@ -240,7 +240,15 @@ bool GenerateModuleAction::BeginSourceFileAction(CompilerInstance &CI, // map with a single module (the common case). return false; } - + + // If we're being run from the command-line, the module build stack will not + // have been filled in yet, so complete it now in order to allow us to detect + // module cycles. + SourceManager &SourceMgr = CI.getSourceManager(); + if (SourceMgr.getModuleBuildStack().empty()) + SourceMgr.pushModuleBuildStack(CI.getLangOpts().CurrentModule, + FullSourceLoc(SourceLocation(), SourceMgr)); + // Dig out the module definition. Module = HS.lookupModule(CI.getLangOpts().CurrentModule, /*AllowSearch=*/false); diff --git a/test/Modules/recursive.c b/test/Modules/recursive.c index 668ba38dff..7941df6840 100644 --- a/test/Modules/recursive.c +++ b/test/Modules/recursive.c @@ -2,8 +2,8 @@ // RUN: not %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -I %S/Inputs %s 2>&1 | FileCheck %s #include "recursive1.h" -// FIXME: rm -rf %t -// FIXME: not %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -emit-module -fmodule-name=recursive1 %S/Inputs/module.map 2>&1 | FileCheck %s +// RUN: rm -rf %t +// RUN: not %clang_cc1 -fmodules -x objective-c -fmodules-cache-path=%t -emit-module -fmodule-name=recursive1 %S/Inputs/module.map 2>&1 | FileCheck %s // CHECK: While building module 'recursive1'{{( imported from .*/recursive.c:3)?}}: // CHECK-NEXT: While building module 'recursive2' imported from {{.*}}Inputs/recursive1.h:1: -- 2.40.0