// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
class Foo {
public:
void foo() {}
};
void f();
int main() {
int integer;
Foo foo;
auto int_copy = integer;
const auto const_int_copy = integer;
const auto& const_int_ref = integer;
auto raw_int_ptr = &integer;
const auto const_raw_int_ptr = &integer;
const auto& const_raw_int_ptr_ref = &integer;
auto* raw_int_ptr_valid = &integer;
const auto* const_raw_int_ptr_valid = &integer;
auto raw_foo_ptr = &foo;
const auto const_raw_foo_ptr = &foo;
const auto& const_raw_foo_ptr_ref = &foo;
auto* raw_foo_ptr_valid = &foo;
const auto* const_raw_foo_ptr_valid = &foo;
int* int_ptr;
auto double_ptr_auto = &int_ptr;
auto* double_ptr_auto_ptr = &int_ptr;
auto** double_ptr_auto_double_ptr = &int_ptr;
auto function_ptr = &f;
auto method_ptr = &Foo::foo;
int* const* const volatile** const* pointer_awesomeness;
auto auto_awesome = pointer_awesomeness;
auto& int_ptr_ref = int_ptr;
const auto& const_int_ptr_ref = int_ptr;
auto&& int_ptr_rref = static_cast<int*&&>(int_ptr);
const auto&& const_int_ptr_rref = static_cast<int*&&>(int_ptr);
}