Hello. The following patch adds a test for PR/63270. The test has been tested before and with r215328, where the bug was fixed.
Thank you, Martin
gcc/testsuite/ChangeLog: 2014-09-19 Martin Liska <mli...@suse.cz> PR LTO/63270 * g++.dg/lto/pr63270_0.C: New test. * g++.dg/lto/pr63270_1.C: New test.
diff --git a/gcc/testsuite/g++.dg/lto/pr63270_0.C b/gcc/testsuite/g++.dg/lto/pr63270_0.C new file mode 100644 index 0000000..98f2735 --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr63270_0.C @@ -0,0 +1,72 @@ +// { dg-lto-do link } +// { dg-lto-options {{-flto -O2 -Wno-odr}} } +typedef unsigned long uintptr_t; +namespace v8 { +class Extension; +namespace internal { +class A { +public: + A(int); +}; +class B { +public: + B(int); +}; +class Scanner; +class FuncNameInferrer; +template <typename Traits> class ParserBase : Traits { + class FunctionState; + bool parenthesized_function_; + typename Traits::Type::Scope *scope_; + FunctionState *function_state_; + v8::Extension *extension_; + FuncNameInferrer *fni_; + Scanner *scanner_; + uintptr_t stack_limit_; + bool stack_overflow_; + bool allow_lazy_; + bool allow_natives_syntax_; + bool allow_generators_; + bool allow_for_of_; + typename Traits::Type::Zone *zone_; +}; +class PreParserScope; +class F; +class PreParserTraits { +public: + struct Type { + typedef PreParserScope Scope; + typedef void Zone; + }; + +private: + F *pre_parser_; +}; +class F : ParserBase<PreParserTraits> {}; +class C { +public: + struct Type { + typedef v8::internal::FuncNameInferrer Scope; + typedef int Zone; + }; +}; +class G : ParserBase<C> { +public: + static int m_fn1(); + F reusable_preparser_; +}; +class D { +public: + D(int) : function_(0), context_(0), nested_scope_chain_(0) { G::m_fn1(); } + B function_; + B context_; + A nested_scope_chain_; +}; +void fn1() { D(0); } +} +} + +int main() +{ + return 0; +} diff --git a/gcc/testsuite/g++.dg/lto/pr63270_1.C b/gcc/testsuite/g++.dg/lto/pr63270_1.C new file mode 100644 index 0000000..a842e5c --- /dev/null +++ b/gcc/testsuite/g++.dg/lto/pr63270_1.C @@ -0,0 +1,53 @@ +typedef unsigned long uintptr_t; +namespace v8 +{ + + int kPointerSize = 0; + + class Extension; + namespace internal + { + class Token; + class Scanner; + int kCodeOffset = 0; + int kOptimizedCodeMapOffset = 0; + int kScopeInfoOffset = 0; + + class FuncNameInferrer; + template < typename Traits > class ParserBase:Traits + { + class FunctionState; + bool parenthesized_function_; + typename Traits::Type::Scope * scope_; + FunctionState *function_state_; + v8::Extension * extension_; + FuncNameInferrer *fni_; + Scanner *scanner_; + uintptr_t stack_limit_; + bool stack_overflow_; + bool allow_lazy_; + bool allow_natives_syntax_; + bool allow_generators_; + bool allow_for_of_; + typename Traits::Type::Zone * zone_; + }; + class PreParserScope; + class PreParser; + class PreParserTraits + { + public:struct Type + { + typedef PreParserScope Scope; + typedef void Zone; + }; + PreParser *pre_parser_; + }; + class PreParser:ParserBase < PreParserTraits > + { + int ParseMemberWithNewPrefixesExpression ( bool * ); + }; + int PreParser::ParseMemberWithNewPrefixesExpression ( bool * ) + { + } + } +}