| /* { dg-do run } */ |
| /* { dg-options "-O2" } */ |
| |
| extern "C" void abort (void); |
| |
| typedef int int32; |
| typedef unsigned int uint32; |
| typedef unsigned long long uint64; |
| typedef short int16; |
| |
| class Tp { |
| public: |
| Tp(int, const int segment, const int index) __attribute__((noinline)); |
| |
| inline bool operator==(const Tp& other) const; |
| inline bool operator!=(const Tp& other) const; |
| int GetType() const { return type_; } |
| int GetSegment() const { return segment_; } |
| int GetIndex() const { return index_; } |
| private: |
| inline static bool IsValidSegment(const int segment); |
| static const int kSegmentBits = 28; |
| static const int kTypeBits = 4; |
| static const int kMaxSegment = (1 << kSegmentBits) - 1; |
| |
| union { |
| |
| struct { |
| int32 index_; |
| uint32 segment_ : kSegmentBits; |
| uint32 type_ : kTypeBits; |
| }; |
| struct { |
| int32 dummy_; |
| uint32 type_and_segment_; |
| }; |
| uint64 value_; |
| }; |
| }; |
| |
| Tp::Tp(int t, const int segment, const int index) |
| : index_(index), segment_(segment), type_(t) {} |
| |
| inline bool Tp::operator==(const Tp& other) const { |
| return value_ == other.value_; |
| } |
| inline bool Tp::operator!=(const Tp& other) const { |
| return value_ != other.value_; |
| } |
| |
| class Range { |
| public: |
| inline Range(const Tp& position, const int count) __attribute__((always_inline)); |
| inline Tp GetBeginTokenPosition() const; |
| inline Tp GetEndTokenPosition() const; |
| private: |
| Tp position_; |
| int count_; |
| int16 begin_index_; |
| int16 end_index_; |
| }; |
| |
| inline Range::Range(const Tp& position, |
| const int count) |
| : position_(position), count_(count), begin_index_(0), end_index_(0) |
| { } |
| |
| inline Tp Range::GetBeginTokenPosition() const { |
| return position_; |
| } |
| inline Tp Range::GetEndTokenPosition() const { |
| return Tp(position_.GetType(), position_.GetSegment(), |
| position_.GetIndex() + count_); |
| } |
| |
| int main () |
| { |
| Range range(Tp(0, 0, 3), 0); |
| if (!(range.GetBeginTokenPosition() == Tp(0, 0, 3))) |
| abort (); |
| |
| if (!(range.GetEndTokenPosition() == Tp(0, 0, 3))) |
| abort(); |
| |
| return 0; |
| } |