Home | History | Annotate | Download | only in testsuite
      1 // gdb_index_test.cc -- a test case for the --gdb-index option.
      2 
      3 // Copyright (C) 2012-2016 Free Software Foundation, Inc.
      4 // Written by Cary Coutant <ccoutant (at) google.com>.
      5 
      6 // This file is part of gold.
      7 
      8 // This program is free software; you can redistribute it and/or modify
      9 // it under the terms of the GNU General Public License as published by
     10 // the Free Software Foundation; either version 3 of the License, or
     11 // (at your option) any later version.
     12 
     13 // This program is distributed in the hope that it will be useful,
     14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
     15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16 // GNU General Public License for more details.
     17 
     18 // You should have received a copy of the GNU General Public License
     19 // along with this program; if not, write to the Free Software
     20 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     21 // MA 02110-1301, USA.
     22 
     23 // This source file defines a number of symbols of different forms
     24 // to exercise the DWARF scanner in gold.
     25 
     26 namespace
     27 {
     28 int c1_count;
     29 int c2_count;
     30 };
     31 
     32 namespace one
     33 {
     34 
     35 enum G
     36 {
     37   G_A,
     38   G_B,
     39   G_C
     40 };
     41 
     42 class c1
     43 {
     44  public:
     45   static int count;
     46 
     47   c1()
     48   { ++c1_count; }
     49 
     50   ~c1()
     51   {
     52     --c1_count;
     53   }
     54 
     55   enum E
     56   {
     57     E_A,
     58     E_B,
     59     E_C,
     60   };
     61 
     62   int
     63   val()
     64   { return E_A; }
     65 };
     66 
     67 c1 c1v;
     68 };
     69 
     70 namespace two
     71 {
     72 const int ci = 3;
     73 
     74 template <typename T>
     75 class c2
     76 {
     77  public:
     78   c2(T t)
     79     : t_(t)
     80   {
     81     ++c2_count;
     82   }
     83 
     84   ~c2()
     85   { --c2_count; }
     86 
     87   T
     88   val()
     89   { return this->t_; }
     90 
     91   T t_;
     92 };
     93 
     94 c2<int> c2v1(1);
     95 c2<double> c2v2(2.0);
     96 c2<int const*> c2v3(&ci);
     97 };
     98 
     99 enum F
    100 {
    101   F_A,
    102   F_B,
    103   F_C
    104 };
    105 
    106 template <class C>
    107 bool
    108 check(C* c)
    109 { return c->val() == 0; }
    110 
    111 bool
    112 check_enum(int i)
    113 { return i > 0; }
    114 
    115 struct anonymous_union_container {
    116   union {
    117     struct astruct {
    118       int a;
    119     };
    120     int b;
    121   } u;
    122 };
    123 
    124 anonymous_union_container anonymous_union_var;
    125 
    126 #ifdef __GNUC__
    127 #define ALWAYS_INLINE __attribute__((always_inline))
    128 #else
    129 #define ALWAYS_INLINE
    130 #endif
    131 
    132 static inline ALWAYS_INLINE int
    133 inline_func_1(int i)
    134 { return i * 17; }
    135 
    136 int
    137 main()
    138 {
    139   F f = F_A;
    140   one::G g = one::G_A;
    141   check_enum(f);
    142   check_enum(g);
    143   check(&one::c1v);
    144   check(&two::c2v1);
    145   check(&two::c2v2);
    146   check(&two::c2v3);
    147   anonymous_union_var.u.b = inline_func_1(3) - 51;
    148   return anonymous_union_var.u.b;
    149 }
    150