176d76d568942e08ee35762532a7090a596af906cSean Callanan//===- SMLoc.h - Source location for use with diagnostics -------*- C++ -*-===//
21ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//
31ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//                     The LLVM Compiler Infrastructure
41ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//
51ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan// This file is distributed under the University of Illinois Open Source
61ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan// License. See LICENSE.TXT for details.
71ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//
81ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//===----------------------------------------------------------------------===//
91ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//
101ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan// This file declares the SMLoc class.  This class encapsulates a location in
111ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan// source code for use in diagnostics.
121ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//
131ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan//===----------------------------------------------------------------------===//
141ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_SUPPORT_SMLOC_H
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_SUPPORT_SMLOC_H
171ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan
18d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner#include <cassert>
19d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner
201ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanannamespace llvm {
211ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan
223ebe59c892051375623fea55e977ff559fdb3323Jordan Rose/// Represents a location in source code.
23d33b276bcb1efd4fa14c32fec68ae24baf30eb28Jim Grosbachclass SMLoc {
241ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan  const char *Ptr;
251ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callananpublic:
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  SMLoc() : Ptr(nullptr) {}
27d33b276bcb1efd4fa14c32fec68ae24baf30eb28Jim Grosbach
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  bool isValid() const { return Ptr != nullptr; }
29d33b276bcb1efd4fa14c32fec68ae24baf30eb28Jim Grosbach
301ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan  bool operator==(const SMLoc &RHS) const { return RHS.Ptr == Ptr; }
311ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan  bool operator!=(const SMLoc &RHS) const { return RHS.Ptr != Ptr; }
32d33b276bcb1efd4fa14c32fec68ae24baf30eb28Jim Grosbach
331ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan  const char *getPointer() const { return Ptr; }
34d33b276bcb1efd4fa14c32fec68ae24baf30eb28Jim Grosbach
351ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan  static SMLoc getFromPointer(const char *Ptr) {
361ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan    SMLoc L;
371ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan    L.Ptr = Ptr;
381ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan    return L;
391ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan  }
401ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan};
411ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan
423ebe59c892051375623fea55e977ff559fdb3323Jordan Rose/// Represents a range in source code.
433ebe59c892051375623fea55e977ff559fdb3323Jordan Rose///
443ebe59c892051375623fea55e977ff559fdb3323Jordan Rose/// SMRange is implemented using a half-open range, as is the convention in C++.
453ebe59c892051375623fea55e977ff559fdb3323Jordan Rose/// In the string "abc", the range (1,3] represents the substring "bc", and the
463ebe59c892051375623fea55e977ff559fdb3323Jordan Rose/// range (2,2] represents an empty range between the characters "b" and "c".
47d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattnerclass SMRange {
48d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattnerpublic:
49d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner  SMLoc Start, End;
50d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner
51d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner  SMRange() {}
5218e2f6e94cf9dc48bfc6dfa3848971aa88e334daNick Kledzik  SMRange(SMLoc St, SMLoc En) : Start(St), End(En) {
53d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner    assert(Start.isValid() == End.isValid() &&
54d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner           "Start and end should either both be valid or both be invalid!");
55d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner  }
56d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner
57d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner  bool isValid() const { return Start.isValid(); }
58d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner};
59d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner
60d8b7aa26134d2abee777f745c32005e63dea2455Chris Lattner} // end namespace llvm
611ae486a4a06a5132c094b9ce66836ff081fea3a6Sean Callanan
6276d76d568942e08ee35762532a7090a596af906cSean Callanan#endif
632122f69c023f197435c289701ebe6cbec9ecb881Sean Callanan
64