Commit 0603fe68 by Jeffrey Yasskin Committed by Jeffrey Yasskin

re PR c++/44641 (Generated constructors and destructors get wrong debug location…

re PR c++/44641 (Generated constructors and destructors get wrong debug location when a typedef uses a forward declaration of the type before the definition)

PR c++/44641
        * gcc/cp/pt.c (instantiate_class_template): Propagate the
        template's location to its instance.

       	* gcc/testsuite/lib/scanasm.exp (dg-function-on-line): Test
        that a function is defined on the current line.
        * gcc/testsuite/g++.dg/debug/dwarf2/lineno-simple1.C: New.
        Line number sanity test.
        * gcc/testsuite/g++.dg/debug/dwarf2/pr44641.C: New.

From-SVN: r162349
parent 1b47fe3f
2010-07-20 Jeffrey Yasskin <jyasskin@google.com>
PR c++/44641
* pt.c (instantiate_class_template): Propagate the template's
location to its instance.
2010-07-20 Jason Merrill <jason@redhat.com>
PR c++/44967
......
......@@ -7832,7 +7832,8 @@ instantiate_class_template (tree type)
/* Set the input location to the most specialized template definition.
This is needed if tsubsting causes an error. */
typedecl = TYPE_MAIN_DECL (pattern);
input_location = DECL_SOURCE_LOCATION (typedecl);
input_location = DECL_SOURCE_LOCATION (TYPE_NAME (type)) =
DECL_SOURCE_LOCATION (typedecl);
TYPE_HAS_USER_CONSTRUCTOR (type) = TYPE_HAS_USER_CONSTRUCTOR (pattern);
TYPE_HAS_NEW_OPERATOR (type) = TYPE_HAS_NEW_OPERATOR (pattern);
......
2010-07-20 Jeffrey Yasskin <jyasskin@google.com>
* lib/scanasm.exp (dg-function-on-line): Test that a function is
defined on the current line.
* g++.dg/debug/dwarf2/lineno-simple1.C: New. Line number sanity test.
* g++.dg/debug/dwarf2/pr44641.C: New.
2010-07-20 Nathan Froyd <froydnj@codesourcery.com>
* gcc.target/powerpc/block-move-1.c: New test.
......
// { dg-do compile }
// { dg-options "-g -O0 -dA" }
struct C { // { dg-function-on-line {_ZN1CC[12]Ev} }
virtual void
foo() {} // { dg-function-on-line _ZN1C3fooEv }
};
static C dummy;
int
main (void)
{ // { dg-function-on-line main }
}
// Origin: PR 44641
// { dg-do compile }
// { dg-options "-g -O0 -dA" }
template <class A> struct MisplacedDbg;
template<class T> struct MisplacedDbg<T*>;
struct Full;
template<> struct MisplacedDbg<Full>;
struct Arg;
typedef MisplacedDbg<Arg> Typedef1;
typedef MisplacedDbg<Arg*> Typedef2;
typedef MisplacedDbg<Full> Typedef3;
template<typename T> struct Base {
virtual ~Base() {
}
};
template <>
struct MisplacedDbg<Full> // { dg-function-on-line {_ZN12MisplacedDbgI4FullEC[12]Ev} }
// { dg-function-on-line {_ZN12MisplacedDbgI4FullED0Ev} { target *-*-* } 21 }
: public Base<int> {
};
template <class T>
struct MisplacedDbg<T*> // { dg-function-on-line {_ZN12MisplacedDbgIP3ArgEC[12]Ev} }
// { dg-function-on-line {_ZN12MisplacedDbgIP3ArgED0Ev} { target *-*-* } 28 }
: public Base<int> {
};
template <class A>
struct MisplacedDbg // { dg-function-on-line {_ZN12MisplacedDbgI3ArgEC[12]Ev} }
// { dg-function-on-line {_ZN12MisplacedDbgI3ArgED0Ev} { target *-*-* } 34 }
: public Base<int> {
};
static MisplacedDbg<Arg> static_var1;
static MisplacedDbg<Arg*> static_var2;
static MisplacedDbg<Full> static_var3;
......@@ -291,3 +291,40 @@ proc scan-assembler-dem-not { args } {
fail "$testcase scan-assembler-dem-not $pp_pattern"
}
}
# Utility for testing that a function is defined on the current line.
# Call pass if so, otherwise fail. Invoked directly; the file must
# have been compiled with -g -dA.
#
# Argument 0 is the current line, passed implicitly by dejagnu
# Argument 1 is the function to check
# Argument 2 handles expected failures and the like
# Argument 3 is "." to match the current line, or an integer to match
# an explicit line.
proc dg-function-on-line { args } {
# Upvar from dg-final:
upvar dg-final-code final-code
set line [lindex $args 0]
set symbol [lindex $args 1]
set failures [lindex $args 2]
if { [llength $args] >= 4 } {
switch [lindex $args 3] {
"." { }
"default" { set line [lindex $args 3] }
}
}
set pattern [format {%s:[^\t]*(\t.file[^\t]*)?\t# \S*:%d\n} \
$symbol $line]
# The lack of spaces around $pattern is important, since they'd
# become part of the regex scan-assembler tries to match.
set cmd "scan-assembler {$pattern}"
if { [llength $args] >= 3 } {
set cmd "$cmd {$failures}"
}
append final-code "$cmd\n"
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment