diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 612b432972745..b94e491de5e46 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -298,6 +298,8 @@ Bug Fixes to C++ Support - Fixed an issue where an attribute on a declarator would cause the attribute to be destructed prematurely. This fixes a pair of Chromium that were brought to our attention by an attempt to fix in (#GH77703). Fixes (#GH83385). +- Fix evaluation of some immediate calls in default arguments. + Fixes (#GH80630) Bug Fixes to AST Handling ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/clang/lib/Sema/SemaExpr.cpp b/clang/lib/Sema/SemaExpr.cpp index 0a449fc1082bd..47bb263f56aad 100644 --- a/clang/lib/Sema/SemaExpr.cpp +++ b/clang/lib/Sema/SemaExpr.cpp @@ -6227,12 +6227,6 @@ struct ImmediateCallVisitor : public RecursiveASTVisitor { return VisitCXXMethodDecl(E->getCallOperator()); } - // Blocks don't support default parameters, and, as for lambdas, - // we don't consider their body a subexpression. - bool VisitBlockDecl(BlockDecl *B) { return false; } - - bool VisitCompoundStmt(CompoundStmt *B) { return false; } - bool VisitCXXDefaultArgExpr(CXXDefaultArgExpr *E) { return TraverseStmt(E->getExpr()); } diff --git a/clang/test/SemaCXX/cxx2a-consteval-default-params.cpp b/clang/test/SemaCXX/cxx2a-consteval-default-params.cpp index be8f7cc788589..e4b13725b2dac 100644 --- a/clang/test/SemaCXX/cxx2a-consteval-default-params.cpp +++ b/clang/test/SemaCXX/cxx2a-consteval-default-params.cpp @@ -82,3 +82,18 @@ namespace GH62224 { C<> Val; // No error since fwd is defined already. static_assert(Val.get() == 42); } + +namespace GH80630 { + +consteval const char* ce() { return "Hello"; } + +auto f2(const char* loc = []( char const* fn ) + { return fn; } ( ce() ) ) { + return loc; +} + +auto g() { + return f2(); +} + +} diff --git a/clang/test/SemaCXX/source_location.cpp b/clang/test/SemaCXX/source_location.cpp index 7414fbce7828d..b151fc45fdad6 100644 --- a/clang/test/SemaCXX/source_location.cpp +++ b/clang/test/SemaCXX/source_location.cpp @@ -832,3 +832,21 @@ void test() { } } + +namespace GH80630 { + +#define GH80630_LAMBDA \ + []( char const* fn ) { \ + static constexpr std::source_location loc = std::source_location::current(); \ + return &loc; \ + }( std::source_location::current().function() ) + +auto f( std::source_location const* loc = GH80630_LAMBDA ) { + return loc; +} + +auto g() { + return f(); +} + +}