blob: 8a3b944ab1cb6d2a572fdafb5ee0322624f1367a [file] [log] [blame]
// RUN: %clang_cc1 -std=c++20 -fsyntax-only -ast-dump -verify %s | FileCheck %s
// Ensure qualifiers are preserved during derived-to-base conversion.
namespace PR127683 {
struct Base {
int Val;
};
struct Derived : Base { };
// Value-initialize base class subobjects with type qualifiers.
volatile Derived VObj;
const Derived CObj{}; // expected-note{{variable 'CObj' declared const here}}
const volatile Derived CVObj{}; // expected-note{{variable 'CVObj' declared const here}}
__attribute__((address_space(1))) Derived AddrSpaceObj{};
void test_store() {
// CHECK: `-ImplicitCastExpr {{.*}} 'volatile PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
VObj.Val = 0;
// CHECK: `-ImplicitCastExpr {{.*}} 'const PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
CObj.Val = 1; // expected-error {{cannot assign to variable 'CObj' with const-qualified type 'const Derived'}}
// CHECK: `-ImplicitCastExpr {{.*}} 'const volatile PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
CVObj.Val = 1; // expected-error {{cannot assign to variable 'CVObj' with const-qualified type 'const volatile Derived'}}
// CHECK: `-ImplicitCastExpr {{.*}} '__attribute__((address_space(1))) PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
AddrSpaceObj.Val = 1;
}
void test_load() {
// CHECK: `-ImplicitCastExpr {{.*}} <col:30> 'volatile PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
[[maybe_unused]] int Val = VObj.Val;
// CHECK: `-ImplicitCastExpr {{.*}} 'const PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
Val = CObj.Val;
// CHECK: `-ImplicitCastExpr {{.*}} 'const volatile PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
Val = CVObj.Val;
// CHECK: `-ImplicitCastExpr {{.*}} '__attribute__((address_space(1))) PR127683::Base' lvalue <UncheckedDerivedToBase (Base)>
Val = AddrSpaceObj.Val;
}
}