The toolchain provided by ST for stm32 has had support for
__FILENAME__ for a while, but clang/llvm has recently implemented
support for __FILE_NAME__, so it seems better to use the same macro
name in GCC.

It happens that the ST patch is similar to the one proposed in PR
c/42579.

Given these input files:
::::::::::::::
mydir/myinc.h
::::::::::::::
char* mystringh_file = __FILE__;
char* mystringh_filename = __FILE_NAME__;
char* mystringh_base_file = __BASE_FILE__;
::::::::::::::
mydir/mysrc.c
::::::::::::::

char* mystring_file = __FILE__;
char* mystring_filename = __FILE_NAME__;
char* mystring_base_file = __BASE_FILE__;

we produce:
$ gcc mydir/mysrc.c -I . -E
1 3 4
char* mystringh_file = "./mydir/myinc.h";
char* mystringh_filename = "myinc.h";
char* mystringh_base_file = "mydir/mysrc.c";

char* mystring_file = "mydir/mysrc.c";
char* mystring_filename = "mysrc.c";
char* mystring_base_file = "mydir/mysrc.c";

2021-05-19  Christophe Lyon  <christophe.l...@linaro.org>
        Torbjörn Svensson  <torbjorn.svens...@st.com>

        PR c/42579
        libcpp/
        * include/cpplib.h (cpp_builtin_type): Add BT_FILE_NAME entry.
        * init.c (builtin_array): Likewise.
        * macro.c (_cpp_builtin_macro_text): Add support for BT_FILE_NAME.

        gcc/testsuite/
        * c-c++-common/spellcheck-reserved.c: Add tests for __FILE_NAME__.
---
 .../c-c++-common/spellcheck-reserved.c         | 18 ++++++++++++++++++
 libcpp/include/cpplib.h                        |  1 +
 libcpp/init.c                                  |  1 +
 libcpp/macro.c                                 | 14 ++++++++++----
 4 files changed, 30 insertions(+), 4 deletions(-)

diff --git a/gcc/testsuite/c-c++-common/spellcheck-reserved.c 
b/gcc/testsuite/c-c++-common/spellcheck-reserved.c
index ed292f2bae0..56e59dcc00a 100644
--- a/gcc/testsuite/c-c++-common/spellcheck-reserved.c
+++ b/gcc/testsuite/c-c++-common/spellcheck-reserved.c
@@ -50,3 +50,21 @@ const char * test_3 (void)
   /* { dg-error "did you mean '__FILE__'" "" { target c } misspelled__FILE_ } 
*/
   /* { dg-error "'__FILE_' was not declared in this scope; did you mean 
'__FILE__'\\?"  "" { target c++ } misspelled__FILE_ } */
 }
+
+/* Verify that we can correct "__FILE_NAME_" to "__FILE_NAME__".  */
+
+const char * test_4 (void)
+{
+  return __FILE_NAME_; /* { dg-line misspelled__FILE_NAME_ } */
+  /* { dg-error "did you mean '__FILE_NAME__'" "" { target c } 
misspelled__FILE_NAME_ } */
+  /* { dg-error "'__FILE_NAME_' was not declared in this scope; did you mean 
'__FILE_NAME__'\\?"  "" { target c++ } misspelled__FILE_NAME_ } */
+}
+
+/* Verify that we can correct "__FILENAME__" to "__FILE_NAME__".  */
+
+const char * test_5 (void)
+{
+  return __FILENAME__; /* { dg-line misspelled__FILENAME__ } */
+  /* { dg-error "did you mean '__FILE_NAME__'" "" { target c } 
misspelled__FILENAME__ } */
+  /* { dg-error "'__FILENAME__' was not declared in this scope; did you mean 
'__FILE_NAME__'\\?"  "" { target c++ } misspelled__FILENAME__ } */
+}
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 2cdaf19362a..7e840635a38 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -886,6 +886,7 @@ enum cpp_builtin_type
   BT_SPECLINE = 0,             /* `__LINE__' */
   BT_DATE,                     /* `__DATE__' */
   BT_FILE,                     /* `__FILE__' */
+  BT_FILE_NAME,                        /* `__FILE_NAME__' */
   BT_BASE_FILE,                        /* `__BASE_FILE__' */
   BT_INCLUDE_LEVEL,            /* `__INCLUDE_LEVEL__' */
   BT_TIME,                     /* `__TIME__' */
diff --git a/libcpp/init.c b/libcpp/init.c
index d5d4e994d2a..a4504700076 100644
--- a/libcpp/init.c
+++ b/libcpp/init.c
@@ -405,6 +405,7 @@ static const struct builtin_macro builtin_array[] =
   B("__TIME__",                 BT_TIME,          false),
   B("__DATE__",                 BT_DATE,          false),
   B("__FILE__",                 BT_FILE,          false),
+  B("__FILE_NAME__",    BT_FILE_NAME,     false),
   B("__BASE_FILE__",    BT_BASE_FILE,     false),
   B("__LINE__",                 BT_SPECLINE,      true),
   B("__INCLUDE_LEVEL__", BT_INCLUDE_LEVEL, true),
diff --git a/libcpp/macro.c b/libcpp/macro.c
index dff7c98a4df..4fc5f838919 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -531,15 +531,21 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode 
*node,
       }
       break;
     case BT_FILE:
+    case BT_FILE_NAME:
     case BT_BASE_FILE:
       {
        unsigned int len;
        const char *name;
        uchar *buf;
-       
-       if (node->value.builtin == BT_FILE)
-         name = linemap_get_expansion_filename (pfile->line_table,
-                                                
pfile->line_table->highest_line);
+
+       if (node->value.builtin == BT_FILE
+           || node->value.builtin == BT_FILE_NAME)
+         {
+           name = linemap_get_expansion_filename (pfile->line_table,
+                                                  
pfile->line_table->highest_line);
+           if ((node->value.builtin == BT_FILE_NAME) && name)
+             name = lbasename (name);
+         }
        else
          {
            name = _cpp_get_file_name (pfile->main_file);
-- 
2.25.1

Reply via email to