Patchwork C++ PATCH for c++/59821 (builtin_LINE in default args)

login
register
mail settings
Submitter Jason Merrill
Date Jan. 16, 2014, 7:54 p.m.
Message ID <52D838E6.4030402@redhat.com>
Download mbox | patch
Permalink /patch/311840/
State New
Headers show

Comments

Jason Merrill - Jan. 16, 2014, 7:54 p.m.
The testcase noted that builtin_LINE used in a default argument was 
getting the location of the call in one case, and the location of the 
function declaration in another.  The way it is used in default 
arguments suggests that the intent is for it to have the location of the 
call.  This patch updates the EXPR_LOCATION of calls to builtin_LINE and 
builtin_FILE to match the location where the default argument is 
expanded, so that the result is consistent.

Tested x86_64-pc-linux-gnu, applying to trunk.
Jakub Jelinek - Jan. 16, 2014, 8:17 p.m.
On Thu, Jan 16, 2014 at 02:54:14PM -0500, Jason Merrill wrote:
> commit 4088607eba17cb79c9bda0d5e2829705c75386b8
> Author: Jason Merrill <jason@redhat.com>
> Date:   Thu Jan 16 13:54:35 2014 -0500
> 
>     	PR c++/59821
>     	* tree.c (bot_manip): Update the location of builtin_LINE and
>     	builtin_FILE calls.

Thanks.  Shouldn't __builtin_FUNCTION be also treated the same?
I mean, those 3 were the builtins added together for this purpose.

	Jakub
Jason Merrill - Jan. 16, 2014, 8:49 p.m.
On 01/16/2014 03:17 PM, Jakub Jelinek wrote:
> On Thu, Jan 16, 2014 at 02:54:14PM -0500, Jason Merrill wrote:
>> commit 4088607eba17cb79c9bda0d5e2829705c75386b8
>> Author: Jason Merrill <jason@redhat.com>
>> Date:   Thu Jan 16 13:54:35 2014 -0500
>>
>>      	PR c++/59821
>>      	* tree.c (bot_manip): Update the location of builtin_LINE and
>>      	builtin_FILE calls.
>
> Thanks.  Shouldn't __builtin_FUNCTION be also treated the same?
> I mean, those 3 were the builtins added together for this purpose.

__builtin_FUNCTION doesn't need any change, because 
current_function_decl already reflects the call site when we expand the 
builtin.

Jason

Patch

commit 4088607eba17cb79c9bda0d5e2829705c75386b8
Author: Jason Merrill <jason@redhat.com>
Date:   Thu Jan 16 13:54:35 2014 -0500

    	PR c++/59821
    	* tree.c (bot_manip): Update the location of builtin_LINE and
    	builtin_FILE calls.

diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c
index 7aad1eb..ce41c3b 100644
--- a/gcc/cp/tree.c
+++ b/gcc/cp/tree.c
@@ -2306,7 +2306,20 @@  bot_manip (tree* tp, int* walk_subtrees, void* data)
   /* Make a copy of this node.  */
   t = copy_tree_r (tp, walk_subtrees, NULL);
   if (TREE_CODE (*tp) == CALL_EXPR)
-    set_flags_from_callee (*tp);
+    {
+      set_flags_from_callee (*tp);
+
+      /* builtin_LINE and builtin_FILE get the location where the default
+	 argument is expanded, not where the call was written.  */
+      tree callee = get_callee_fndecl (*tp);
+      if (callee && DECL_BUILT_IN (callee))
+	switch (DECL_FUNCTION_CODE (callee))
+	  {
+	  case BUILT_IN_FILE:
+	  case BUILT_IN_LINE:
+	    SET_EXPR_LOCATION (*tp, input_location);
+	  }
+    }
   return t;
 }
 
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 84fd594..8568316 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -8726,6 +8726,8 @@  means that the compiler can assume for @code{x}, set to @code{arg}, that
 @deftypefn {Built-in Function} int __builtin_LINE ()
 This function is the equivalent to the preprocessor @code{__LINE__}
 macro and returns the line number of the invocation of the built-in.
+In a C++ default argument for a function F, it gets the line number of
+the call to F.
 @end deftypefn
 
 @deftypefn {Built-in Function} {const char *} __builtin_FUNCTION ()
@@ -8736,6 +8738,8 @@  macro and returns the function name the invocation of the built-in is in.
 @deftypefn {Built-in Function} {const char *} __builtin_FILE ()
 This function is the equivalent to the preprocessor @code{__FILE__}
 macro and returns the file name the invocation of the built-in is in.
+In a C++ default argument for a function F, it gets the file name of
+the call to F.
 @end deftypefn
 
 @deftypefn {Built-in Function} void __builtin___clear_cache (char *@var{begin}, char *@var{end})
diff --git a/gcc/testsuite/g++.dg/ext/builtin-line1.C b/gcc/testsuite/g++.dg/ext/builtin-line1.C
new file mode 100644
index 0000000..21a4f59
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ext/builtin-line1.C
@@ -0,0 +1,17 @@ 
+// __builtin_LINE gets the location where the default argument is expanded.
+// { dg-do run }
+
+#include <cassert>
+struct Foo
+{
+  int line;
+  Foo( int line = __builtin_LINE() )
+    : line( line )
+  {}
+};
+
+int main()
+{
+  assert (Foo().line == __LINE__);
+  assert ((new Foo)->line == __LINE__);
+}