Message ID | 1515712881-50591-1-git-send-email-dmalcolm@redhat.com |
---|---|
State | New |
Headers | show |
Series | Fix failure building LLVM with location wrapper nodes (PR c++/83799) | expand |
On 2018.01.11 at 18:21 -0500, David Malcolm wrote: > diff --git a/gcc/testsuite/g++.dg/wrappers/pr83799.C b/gcc/testsuite/g++.dg/wrappers/pr83799.C > new file mode 100644 > index 0000000..f93c0ae > --- /dev/null > +++ b/gcc/testsuite/g++.dg/wrappers/pr83799.C > @@ -0,0 +1,18 @@ > +class DataLayout; > +class TargetLoweringBase { > + void getTypeLegalizationCost(const DataLayout &DL) const; > +}; > +class TargetTransformInfoImplBase { > + const DataLayout &DL; // this line isn't actually needed to reproduce the issue > +}; > +template <typename T> > +class TargetTransformInfoImplCRTPBase : public TargetTransformInfoImplBase {}; > +template <typename T> > +class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> { > + const TargetLoweringBase *getTLI() const; > + using TargetTransformInfoImplBase::DL; > + void getArithmeticInstrCost() { > + const TargetLoweringBase *TLI = getTLI(); > + TLI->getTypeLegalizationCost(DL); > + } > +}; Thanks for the fix. Minor nit: Please make TargetLoweringBase and TargetLoweringBase a struct instead of a class, to prevent illegal access of private members.
On 2018.01.12 at 09:07 +0100, Markus Trippelsdorf wrote: > On 2018.01.11 at 18:21 -0500, David Malcolm wrote: > > diff --git a/gcc/testsuite/g++.dg/wrappers/pr83799.C b/gcc/testsuite/g++.dg/wrappers/pr83799.C > > new file mode 100644 > > index 0000000..f93c0ae > > --- /dev/null > > +++ b/gcc/testsuite/g++.dg/wrappers/pr83799.C > > @@ -0,0 +1,18 @@ > > +class DataLayout; > > +class TargetLoweringBase { > > + void getTypeLegalizationCost(const DataLayout &DL) const; > > +}; > > +class TargetTransformInfoImplBase { > > + const DataLayout &DL; // this line isn't actually needed to reproduce the issue > > +}; > > +template <typename T> > > +class TargetTransformInfoImplCRTPBase : public TargetTransformInfoImplBase {}; > > +template <typename T> > > +class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> { > > + const TargetLoweringBase *getTLI() const; > > + using TargetTransformInfoImplBase::DL; > > + void getArithmeticInstrCost() { > > + const TargetLoweringBase *TLI = getTLI(); > > + TLI->getTypeLegalizationCost(DL); > > + } > > +}; > > Thanks for the fix. Minor nit: > Please make TargetLoweringBase and TargetLoweringBase a struct instead TargetTransformInfoImplBase
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 4f8086b..9517fd9 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -24219,6 +24219,8 @@ type_dependent_expression_p (tree expression) if (expression == NULL_TREE || expression == error_mark_node) return false; + STRIP_ANY_LOCATION_WRAPPER (expression); + /* An unresolved name is always dependent. */ if (identifier_p (expression) || TREE_CODE (expression) == USING_DECL @@ -26657,12 +26659,38 @@ test_build_non_dependent_expr () build_non_dependent_expr (wrapped_string_lit)); } +/* Verify that type_dependent_expression_p () works correctly, even + in the presence of location wrapper nodes. */ + +static void +test_type_dependent_expression_p () +{ + location_t loc = BUILTINS_LOCATION; + + /* A USING_DECL in a template should be type-dependent, even if wrapped + with a location wrapper (PR c++/83799). */ + + ++processing_template_decl; + + tree name = get_identifier ("foo"); + ASSERT_TRUE (type_dependent_expression_p (name)); + tree using_decl = build_lang_decl (USING_DECL, name, NULL_TREE); + TREE_TYPE (using_decl) = integer_type_node; + ASSERT_TRUE (type_dependent_expression_p (using_decl)); + tree wrapped_using_decl = maybe_wrap_with_location (using_decl, loc); + ASSERT_TRUE (location_wrapper_p (wrapped_using_decl)); + ASSERT_TRUE (type_dependent_expression_p (wrapped_using_decl)); + + --processing_template_decl; +} + /* Run all of the selftests within this file. */ void cp_pt_c_tests () { test_build_non_dependent_expr (); + test_type_dependent_expression_p (); } } // namespace selftest diff --git a/gcc/testsuite/g++.dg/wrappers/pr83799.C b/gcc/testsuite/g++.dg/wrappers/pr83799.C new file mode 100644 index 0000000..f93c0ae --- /dev/null +++ b/gcc/testsuite/g++.dg/wrappers/pr83799.C @@ -0,0 +1,18 @@ +class DataLayout; +class TargetLoweringBase { + void getTypeLegalizationCost(const DataLayout &DL) const; +}; +class TargetTransformInfoImplBase { + const DataLayout &DL; // this line isn't actually needed to reproduce the issue +}; +template <typename T> +class TargetTransformInfoImplCRTPBase : public TargetTransformInfoImplBase {}; +template <typename T> +class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase<T> { + const TargetLoweringBase *getTLI() const; + using TargetTransformInfoImplBase::DL; + void getArithmeticInstrCost() { + const TargetLoweringBase *TLI = getTLI(); + TLI->getTypeLegalizationCost(DL); + } +};