https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80780
Bug ID: 80780 Summary: Front-end support needed for experimental::source_location Product: gcc Version: 8.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: redi at gcc dot gnu.org Target Milestone: --- I've just added a partial implementation of <experimental/source_location> to trunk (r248110). The missing pieces need some FE help. 1) because the location info returned by source_location::current() should be the location of the caller the current implementation uses default arguments: struct source_location { // 14.1.2, source_location creation static constexpr source_location current(const char* __file = __builtin_FILE(), const char* __func = __builtin_FUNCTION(), int __line = __builtin_LINE(), int __col = 0) noexcept { source_location __loc; __loc._M_file = __file; __loc._M_func = __func; __loc._M_line = __line; __loc._M_col = __col; return __loc; } This works OK, but means the signature of the function doesn't match the one in the TS (which has no parameters). The standard does allow us to add parameters with default arguments to member functions, but it might be nice if it wasn't needed. I'm not sure how best to do that. Maybe make the FE recognise std::experimental::fundamentals_v2::source_location::current() as magic, so that location info inside the function uses the location of the caller? Maybe add a new attribute to perform said magic for any inline function? (If current() is called indirectly, e.g. through a function pointer, the result is unspecified so the magic doesn't need to work when the function isn't inlined). 2) source_location::current().function_name() uses __func__ which is not very descriptive in C++. It would be nice to have a __builtin_PRETTY_FUNCTION to get a better function name than __builtin_FUNCTION provides. 3) source_location::column().column() always returns zero, because there's no "__builtin_column" to get a column number, the way __builtin_LINE gives a line number. I mistakenly though that calling current() in a default member initializer gave the wrong locations, but it does the right thing (giving the location of the constructor body that initializes the member).