diff options
Diffstat (limited to 'include/clang/Basic/PartialDiagnostic.h')
-rw-r--r-- | include/clang/Basic/PartialDiagnostic.h | 33 |
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, |