#include <iostream>
struct A { int x; constexpr A(int i) noexcept : x{i} {} };
struct B { A a; constexpr B(A a) noexcept : a{a} {} };
constexpr int foo() {
A a{55};
B b{a};
return b.a.x;
}
template<int N>
void output()
{
std::cout << N << std::endl;
}
int main() {
// to be absolutely sure compile time eval'd,
// pass as template arg
constexpr auto b = foo();
output<b>();
}
ICAgICNpbmNsdWRlIDxpb3N0cmVhbT4KCiAgICBzdHJ1Y3QgQSB7IGludCB4OyBjb25zdGV4cHIgQShpbnQgaSkgbm9leGNlcHQgOiB4e2l9IHt9IH07CiAgICBzdHJ1Y3QgQiB7IEEgYTsgY29uc3RleHByIEIoQSBhKSBub2V4Y2VwdCA6IGF7YX0ge30gfTsKCiAgICBjb25zdGV4cHIgaW50IGZvbygpIHsKICAgIAlBIGF7NTV9OwogICAgICAgIEIgYnthfTsKICAgICAgICByZXR1cm4gYi5hLng7CiAgICB9CgogICAgdGVtcGxhdGU8aW50IE4+CiAgICB2b2lkIG91dHB1dCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8IE4gPDwgc3RkOjplbmRsOwogICAgfQoKICAgIGludCBtYWluKCkgewogICAgICAgIC8vIHRvIGJlIGFic29sdXRlbHkgc3VyZSBjb21waWxlIHRpbWUgZXZhbCdkLAogICAgICAgIC8vIHBhc3MgYXMgdGVtcGxhdGUgYXJnCiAgICAgICAgY29uc3RleHByIGF1dG8gYiA9IGZvbygpOwogICAgICAgIG91dHB1dDxiPigpOwogICAgfQ==