Skip to content
Snippets Groups Projects
  • Jakub Jelinek's avatar
    1c585664
    c++: Implement C++26 P2361R6 - Unevaluated strings [PR110342] · 1c585664
    Jakub Jelinek authored
    The following patch implements C++26 unevaluated-string.
    As it seems to me just extra pedanticity, it is implemented only for
    -std=c++26 or -std=gnu++26 and later and only if -pedantic/-pedantic-errors.
    Nothing is done for inline asm, while the spec changes those, it changes it
    to a balanced token sequence with implementation defined rules on what is
    and isn't allowed (so pedantically accepting asm ("" : "+m" (x));
    was accepts-invalid before C++26, but we didn't diagnose anything).
    For the other spots mentioned in the paper, static_assert message,
    linkage specification, deprecated/nodiscard attributes it enforces the
    requirements (no prefixes, udlit suffixes, no octal/hexadecimal escapes
    (conditional escape sequences were rejected with pedantic already before).
    For the deprecated operator "" identifier case I've kept things as is,
    because everything seems to have been diagnosed already (a lot being implied
    from the string having to be empty).
    
    2023-11-02  Jakub Jelinek  <jakub@redhat.com>
    
    	PR c++/110342
    gcc/cp/
    	* parser.cc: Implement C++26 P2361R6 - Unevaluated strings.
    	(uneval_string_attr): New enumerator.
    	(cp_parser_string_literal_common): Add UNEVAL argument.  If true,
    	pass CPP_UNEVAL_STRING rather than CPP_STRING to
    	cpp_interpret_string_notranslate.
    	(cp_parser_string_literal, cp_parser_userdef_string_literal): Adjust
    	callers of cp_parser_string_literal_common.
    	(cp_parser_unevaluated_string_literal): New function.
    	(cp_parser_parenthesized_expression_list): Handle uneval_string_attr.
    	(cp_parser_linkage_specification): Use
    	cp_parser_unevaluated_string_literal for C++26.
    	(cp_parser_static_assert): Likewise.
    	(cp_parser_std_attribute): Use uneval_string_attr for standard
    	deprecated and nodiscard attributes.
    gcc/testsuite/
    	* g++.dg/cpp26/unevalstr1.C: New test.
    	* g++.dg/cpp26/unevalstr2.C: New test.
    	* g++.dg/cpp0x/udlit-error1.C (lol): Expect an error for C++26
    	about user-defined literal in deprecated attribute.
    libcpp/
    	* include/cpplib.h (TTYPE_TABLE): Add CPP_UNEVAL_STRING literal
    	entry.  Use C++11 instead of C++-0x in comments.
    	* charset.cc (convert_escape): Add UNEVAL argument, if true,
    	pedantically diagnose numeric escape sequences.
    	(cpp_interpret_string_1): Formatting fix.  Adjust convert_escape
    	caller.
    	(cpp_interpret_string): Formatting string.
    	(cpp_interpret_string_notranslate): Pass type through to
    	cpp_interpret_string if it is CPP_UNEVAL_STRING.
    1c585664
    History
    c++: Implement C++26 P2361R6 - Unevaluated strings [PR110342]
    Jakub Jelinek authored
    The following patch implements C++26 unevaluated-string.
    As it seems to me just extra pedanticity, it is implemented only for
    -std=c++26 or -std=gnu++26 and later and only if -pedantic/-pedantic-errors.
    Nothing is done for inline asm, while the spec changes those, it changes it
    to a balanced token sequence with implementation defined rules on what is
    and isn't allowed (so pedantically accepting asm ("" : "+m" (x));
    was accepts-invalid before C++26, but we didn't diagnose anything).
    For the other spots mentioned in the paper, static_assert message,
    linkage specification, deprecated/nodiscard attributes it enforces the
    requirements (no prefixes, udlit suffixes, no octal/hexadecimal escapes
    (conditional escape sequences were rejected with pedantic already before).
    For the deprecated operator "" identifier case I've kept things as is,
    because everything seems to have been diagnosed already (a lot being implied
    from the string having to be empty).
    
    2023-11-02  Jakub Jelinek  <jakub@redhat.com>
    
    	PR c++/110342
    gcc/cp/
    	* parser.cc: Implement C++26 P2361R6 - Unevaluated strings.
    	(uneval_string_attr): New enumerator.
    	(cp_parser_string_literal_common): Add UNEVAL argument.  If true,
    	pass CPP_UNEVAL_STRING rather than CPP_STRING to
    	cpp_interpret_string_notranslate.
    	(cp_parser_string_literal, cp_parser_userdef_string_literal): Adjust
    	callers of cp_parser_string_literal_common.
    	(cp_parser_unevaluated_string_literal): New function.
    	(cp_parser_parenthesized_expression_list): Handle uneval_string_attr.
    	(cp_parser_linkage_specification): Use
    	cp_parser_unevaluated_string_literal for C++26.
    	(cp_parser_static_assert): Likewise.
    	(cp_parser_std_attribute): Use uneval_string_attr for standard
    	deprecated and nodiscard attributes.
    gcc/testsuite/
    	* g++.dg/cpp26/unevalstr1.C: New test.
    	* g++.dg/cpp26/unevalstr2.C: New test.
    	* g++.dg/cpp0x/udlit-error1.C (lol): Expect an error for C++26
    	about user-defined literal in deprecated attribute.
    libcpp/
    	* include/cpplib.h (TTYPE_TABLE): Add CPP_UNEVAL_STRING literal
    	entry.  Use C++11 instead of C++-0x in comments.
    	* charset.cc (convert_escape): Add UNEVAL argument, if true,
    	pedantically diagnose numeric escape sequences.
    	(cpp_interpret_string_1): Formatting fix.  Adjust convert_escape
    	caller.
    	(cpp_interpret_string): Formatting string.
    	(cpp_interpret_string_notranslate): Pass type through to
    	cpp_interpret_string if it is CPP_UNEVAL_STRING.