Index: clang/lib/AST/Interp/Pointer.cpp =================================================================== --- clang/lib/AST/Interp/Pointer.cpp +++ clang/lib/AST/Interp/Pointer.cpp @@ -148,6 +148,12 @@ } } + // We assemble the LValuePath starting from the innermost pointer to the + // outermost one. SO in a.b.c, the first element in Path will refer to + // the field 'c', while later code expects it to refer to 'a'. + // Just invert the order of the elements. + std::reverse(Path.begin(), Path.end()); + return APValue(Base, Offset, Path, IsOnePastEnd, IsNullPtr); } Index: clang/test/AST/Interp/records.cpp =================================================================== --- clang/test/AST/Interp/records.cpp +++ clang/test/AST/Interp/records.cpp @@ -153,11 +153,7 @@ constexpr FourBoolPairs LT; // Copy ctor constexpr FourBoolPairs LT2 = LT; -// FIXME: The copy constructor call above -// works, but APValue we generate for it is -// not sufficiently correct, so the lvalue-to-rvalue -// conversion in ExprConstant.c runs into an assertion. -//static_assert(LT2.v[0].first == false, ""); -//static_assert(LT2.v[0].second == false, ""); -//static_assert(LT2.v[2].first == true, ""); -//static_assert(LT2.v[2].second == false, ""); +static_assert(LT2.v[0].first == false, ""); +static_assert(LT2.v[0].second == false, ""); +static_assert(LT2.v[2].first == true, ""); +static_assert(LT2.v[2].second == false, "");