[clang] Remove misleading assertion in FullSourceLoc
D31709 added an assertion was added to `FullSourceLoc::hasManager()` that ensured a valid `SourceLocation` is always paired with a `SourceManager`, and missing `SourceManager` is always paired with an invalid `SourceLocation`. This appears to be incorrect, since clients never cared about constructing `FullSourceLoc` to uphold that invariant, or always checking `isValid()` before calling `hasManager()`. The assertion started failing when serializing diagnostics pointing into an explicit module. Explicit modules don't have valid `SourceLocation` for the `import` statement, since they are "imported" from the command-line argument `-fmodule-name=x.pcm`. This patch removes the assertion, since `FullSourceLoc` was never intended to uphold any kind of invariants between the validity of `SourceLocation` and presence of `SourceManager`. Reviewed By: arphaman Differential Revision: https://reviews.llvm.org/D106862
This commit is contained in:
parent
3709822d26
commit
4aafd5f00c
|
@ -363,6 +363,10 @@ class FileEntry;
|
|||
/// A SourceLocation and its associated SourceManager.
|
||||
///
|
||||
/// This is useful for argument passing to functions that expect both objects.
|
||||
///
|
||||
/// This class does not guarantee the presence of either the SourceManager or
|
||||
/// a valid SourceLocation. Clients should use `isValid()` and `hasManager()`
|
||||
/// before calling the member functions.
|
||||
class FullSourceLoc : public SourceLocation {
|
||||
const SourceManager *SrcMgr = nullptr;
|
||||
|
||||
|
@ -373,13 +377,10 @@ public:
|
|||
explicit FullSourceLoc(SourceLocation Loc, const SourceManager &SM)
|
||||
: SourceLocation(Loc), SrcMgr(&SM) {}
|
||||
|
||||
bool hasManager() const {
|
||||
bool hasSrcMgr = SrcMgr != nullptr;
|
||||
assert(hasSrcMgr == isValid() && "FullSourceLoc has location but no manager");
|
||||
return hasSrcMgr;
|
||||
}
|
||||
/// Checks whether the SourceManager is present.
|
||||
bool hasManager() const { return SrcMgr != nullptr; }
|
||||
|
||||
/// \pre This FullSourceLoc has an associated SourceManager.
|
||||
/// \pre hasManager()
|
||||
const SourceManager &getManager() const {
|
||||
assert(SrcMgr && "SourceManager is NULL.");
|
||||
return *SrcMgr;
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
void a() __attribute__((deprecated));
|
|
@ -0,0 +1 @@
|
|||
module a { header "a.h" }
|
|
@ -0,0 +1,8 @@
|
|||
// RUN: rm -rf %t && mkdir %t
|
||||
// RUN: %clang_cc1 -fmodules -x c++ %S/Inputs/explicit-build-diags/module.modulemap -fmodule-name=a -emit-module -o %t/a.pcm
|
||||
// RUN: %clang_cc1 -fmodules -Wdeprecated-declarations -fdiagnostics-show-note-include-stack -serialize-diagnostic-file %t/tu.dia \
|
||||
// RUN: -I %S/Inputs/explicit-build-diags -fmodule-file=%t/a.pcm -fsyntax-only %s
|
||||
|
||||
#include "a.h"
|
||||
|
||||
void foo() { a(); }
|
Loading…
Reference in New Issue