// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// RUN: cxx_compiler cxx_11 -c %s -o %t.o
// RUN: bindump %t.o | FileCheck prefixes %s

// CHECK-DAG: _ZdlPv
void operator delete(void *) {}

// CHECK-DAG: _ZdaPv
void operator delete[](void *) {}

// General structures for operands.
struct operand {};
struct operations {
    void operator= (operand);
    void operator->* (operand);
    void operator-> ();
    void operator() (operand);
    void operator[] (operand);
};
// CHECK-DAG: _Zps7operand
void operator+ (operand) {}
// CHECK-DAG: _Zng7operand
void operator- (operand) {}
// CHECK-DAG: _Zad7operand
void operator& (operand) {}
// CHECK-DAG: _Zde7operand
void operator* (operand) {}
// CHECK-DAG: _Zco7operand
void operator~ (operand) {}
// CHECK-DAG: _Zpl7operandS_
void operator+ (operand, operand) {}
// CHECK-DAG: _Zmi7operandS_
void operator- (operand, operand) {}
// CHECK-DAG: _Zml7operandS_
void operator* (operand, operand) {}
// CHECK-DAG: _Zdv7operandS_
void operator/ (operand, operand) {}
// CHECK-DAG: _Zrm7operandS_
void operator% (operand, operand) {}
// CHECK-DAG: _Zan7operandS_
void operator& (operand, operand) {}
// CHECK-DAG: _Zor7operandS_
void operator| (operand, operand) {}
// CHECK-DAG: _Zeo7operandS_
void operator^ (operand, operand) {}
// CHECK-DAG: _ZN10operationsaSE7operand
void operations::operator= (operand) {}
// CHECK-DAG: _ZpL7operandS_
void operator+= (operand, operand) {}
// CHECK-DAG: _ZmI7operandS_
void operator-= (operand, operand) {}
// CHECK-DAG: _ZmL7operandS_
void operator*= (operand, operand) {}
// CHECK-DAG: _ZdV7operandS_
void operator/= (operand, operand) {}
// CHECK-DAG: _ZrM7operandS_
void operator%= (operand, operand) {}
// CHECK-DAG: _ZaN7operandS_
void operator&= (operand, operand) {}
// CHECK-DAG: _ZoR7operandS_
void operator|= (operand, operand) {}
// CHECK-DAG: _ZeO7operandS_
void operator^= (operand, operand) {}
// CHECK-DAG: _Zls7operandS_
void operator<< (operand, operand) {}
// CHECK-DAG: _Zrs7operandS_
void operator>> (operand, operand) {}
// CHECK-DAG: _ZlS7operandS_
void operator<<= (operand, operand) {}
// CHECK-DAG: _ZrS7operandS_
void operator>>= (operand, operand) {}
// CHECK-DAG: _Zeq7operandS_
void operator== (operand, operand) {}
// CHECK-DAG: _Zne7operandS_
void operator!= (operand, operand) {}
// CHECK-DAG: _Zlt7operandS_
void operator< (operand, operand) {}
// CHECK-DAG: _Zgt7operandS_
void operator> (operand, operand) {}
// CHECK-DAG: _Zle7operandS_
void operator<= (operand, operand) {}
// CHECK-DAG: _Zge7operandS_
void operator>= (operand, operand) {}
// CHECK-DAG: _Znt7operand
void operator! (operand) {}
// CHECK-DAG: _Zaa7operandS_
void operator&& (operand, operand) {}
// CHECK-DAG: _Zoo7operandS_
void operator|| (operand, operand) {}
// CHECK-DAG: _Zpp7operand
void operator++ (operand) {}
// CHECK-DAG: _Zmm7operand
void operator-- (operand) {}
// CHECK-DAG: _Zcm7operandS_
void operator, (operand, operand) {}
// CHECK-DAG: _ZN10operationspmE7operand
void operations::operator->* (operand) {}
// CHECK-DAG: _ZN10operationsptE
void operations::operator-> () {}
// CHECK-DAG: _ZN10operationsclE7operand
void operations::operator() (operand) {}
// CHECK-DAG: _ZN10operationsixE7operand
void operations::operator[] (operand) {}

struct Type {};
struct castable {
    operator float();
    operator char const *();
    operator Type();
};
// CHECK-DAG: _ZN8castablecvfEv
castable::operator float() { return 1.0f; }
// CHECK-DAG: _ZN8castablecvPKcEv
castable::operator char const*() { return "this"; }
// CHECK-DAG: _ZN8castablecv4TypeEv
castable::operator Type() { return Type(); }

