summaryrefslogtreecommitdiffstats
path: root/include/clang/Basic/PartialDiagnostic.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Basic/PartialDiagnostic.h')
-rw-r--r--include/clang/Basic/PartialDiagnostic.h33
1 files changed, 24 insertions, 9 deletions
diff --git a/include/clang/Basic/PartialDiagnostic.h b/include/clang/Basic/PartialDiagnostic.h
index 9960d5b..ae11a75 100644
--- a/include/clang/Basic/PartialDiagnostic.h
+++ b/include/clang/Basic/PartialDiagnostic.h
@@ -51,11 +51,11 @@ class PartialDiagnostic {
/// This is used when the argument is not an std::string. The specific value
/// is mangled into an intptr_t and the intepretation depends on exactly
/// what sort of argument kind it is.
- mutable intptr_t DiagArgumentsVal[MaxArguments];
+ intptr_t DiagArgumentsVal[MaxArguments];
/// DiagRanges - The list of ranges added to this diagnostic. It currently
/// only support 10 ranges, could easily be extended if needed.
- mutable const SourceRange *DiagRanges[10];
+ SourceRange DiagRanges[10];
};
/// DiagID - The diagnostic ID.
@@ -81,25 +81,40 @@ class PartialDiagnostic {
assert(DiagStorage->NumDiagRanges <
llvm::array_lengthof(DiagStorage->DiagRanges) &&
"Too many arguments to diagnostic!");
- DiagStorage->DiagRanges[DiagStorage->NumDiagRanges++] = &R;
+ DiagStorage->DiagRanges[DiagStorage->NumDiagRanges++] = R;
}
- void operator=(const PartialDiagnostic &); // DO NOT IMPLEMENT
-
public:
PartialDiagnostic(unsigned DiagID)
: DiagID(DiagID), DiagStorage(0) { }
PartialDiagnostic(const PartialDiagnostic &Other)
- : DiagID(Other.DiagID), DiagStorage(Other.DiagStorage) {
- Other.DiagID = 0;
- Other.DiagStorage = 0;
+ : DiagID(Other.DiagID), DiagStorage(0)
+ {
+ if (Other.DiagStorage)
+ DiagStorage = new Storage(*Other.DiagStorage);
+ }
+
+ PartialDiagnostic &operator=(const PartialDiagnostic &Other) {
+ DiagID = Other.DiagID;
+ if (Other.DiagStorage) {
+ if (DiagStorage)
+ *DiagStorage = *Other.DiagStorage;
+ else
+ DiagStorage = new Storage(*Other.DiagStorage);
+ } else {
+ delete DiagStorage;
+ DiagStorage = 0;
+ }
+
+ return *this;
}
~PartialDiagnostic() {
delete DiagStorage;
}
+
unsigned getDiagID() const { return DiagID; }
void Emit(const DiagnosticBuilder &DB) const {
@@ -114,7 +129,7 @@ public:
// Add all ranges.
for (unsigned i = 0, e = DiagStorage->NumDiagRanges; i != e; ++i)
- DB.AddSourceRange(*DiagStorage->DiagRanges[i]);
+ DB.AddSourceRange(DiagStorage->DiagRanges[i]);
}
friend const PartialDiagnostic &operator<<(const PartialDiagnostic &PD,
OpenPOWER on IntegriCloud