// ver_matching_def.cc - test matching rules in version_script.map

// Copyright (C) 2007-2021 Free Software Foundation, Inc.
// Written by Cary Coutant <ccoutant@google.com>.

// This file is part of gold.

// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
// MA 02110-1301, USA.

extern "C" {
void foo() {} // V1
void foo1() {} // local
};

void bar() {} // V1
void bar1() {} // global

void baz(int*) {}          // V1
void baz(int*, char) {}    // global
void baz(char*, int) {}    // global

extern "C" {
void bar2() {}  // V1
};

namespace myns {
void blah() {} // V1
void bip() {} // V1

class Stuff {
 public:
  Stuff() {} // V1
};
}

class Biz {
 public:
  Biz() {} // global
};

namespace otherns {
Biz biz; // global
myns::Stuff stuff;  // V2
};

extern "C" {
void blaza() {}  // V1
void blaza1() {}  // V1

void original_blaza2() {} // V2
__asm__(".symver original_blaza2,blaza2@@V2");  // overrides script

void bla() {} // global
void blaz() {} // V2
void blazb() {} // V2

int globaoeufxstuff = 0;  // V1
int globaoeufostuff = 0; // global
float sizeof_headers = 50.0;  // V1
};
