Index: clang/lib/AST/Interp/InterpFrame.cpp =================================================================== --- clang/lib/AST/Interp/InterpFrame.cpp +++ clang/lib/AST/Interp/InterpFrame.cpp @@ -120,6 +120,9 @@ F = F.isArrayElement() ? F.getArray().expand() : F.getBase(); } + // Drop the first pointer since we print it unconditionally anyway. + Levels.erase(Levels.begin()); + printDesc(P.getDeclDesc()); for (const auto &It : Levels) { if (It.inArray()) { Index: clang/test/AST/Interp/constexpr-nqueens.cpp =================================================================== --- clang/test/AST/Interp/constexpr-nqueens.cpp +++ clang/test/AST/Interp/constexpr-nqueens.cpp @@ -6,9 +6,6 @@ /// Board constructors. /// This tests that InterpFrame::describe(). -// FIXME: With the new interpreter, most of the described frames are -// currently broken in one way or another. - typedef unsigned long uint64_t; struct Board { @@ -52,17 +49,17 @@ return Row == N ? Board(0, true) : B.ok(Row, Col) ? tryBoard(buildBoardRecurse(N, Col + 1, B.addQueen(Row, Col)), // ref-note {{in call to '&Board()->addQueen(0, 0)}} \ - // expected-note {{in call to '&Board().Board()->addQueen(0, 0)}} + // expected-note {{in call to '&Board()->addQueen(0, 0)}} N, Col, Row+1, B) : buildBoardScan(N, Col, Row + 1, B); } constexpr Board buildBoardRecurse(int N, int Col, const Board &B) { return Col == N ? B : buildBoardScan(N, Col, 0, B); // ref-note {{in call to 'buildBoardScan(8, 0, 0, Board())'}} \ - // expected-note {{in call to 'buildBoardScan(8, 0, 0, Board().Board())}} + // expected-note {{in call to 'buildBoardScan(8, 0, 0, Board())}} } constexpr Board buildBoard(int N) { return buildBoardRecurse(N, 0, Board()); // ref-note {{in call to 'buildBoardRecurse(8, 0, Board())'}} \ - // expected-note {{in call to 'buildBoardRecurse(8, 0, Board().Board())'}} + // expected-note {{in call to 'buildBoardRecurse(8, 0, Board())'}} } constexpr Board q8 = buildBoard(8); // ref-error {{must be initialized by a constant expression}} \