Fix: using statement in another namespace that pointer to type alias
Reopen PR #1286
Thanks for your pull request! This is your first PR since the project has permanently switched to a standard commercial OSS license, and I've emailed you the new Contributor License Agreement (CLA), which will cover this and all your future contributions. Once it's completed I can look at your PR. For more details see https://github.com/hsutter/cppfront/discussions/1322 .
Thanks!
I am not able to make progress evaluating this because it seems to need testing...
- Test self-build by:
a) Building
cppfront.cppas usual which builds from the Cpp1 sources b) Using thatcppfront.exeto buildreflect.h2andcpp2regex.h2(this should result in no surprising diffs) -- see themainbranch'sbuild_h2.batc) Buildingcppfront.cppagain (this should work) - Test generating regression tests by:
a) Building the Cpp2 tests into Cpp1 tests -- go to
regression-tests/test-resultsand then runrun-tests.batb) Build the resulting Cpp1 tests using at least one compiler -- go toregression-tests/test-results/<your preferred configuation>and then run that directory'srun-tests-...(a.bator a.sh)
I'm currently getting failures at 1(c). I've just committed the results of 1(b) for reference.
Seems the main branch have modified on my previous code base commit, I will fix it later.
I find the root cause Here is the example
namespace A {
template<bool> struct t { };
constexpr bool f(const t<true>&) { return true; }
constexpr t<true> o{};
} // namespace ns
A : namespace = {
t1: <_: t<o.f()>> type == bool;
}
B : namespace = {
using A::t1;
}
int main()
{
return 0;
}
From main branch, it would become
#line 9 "test.cpp2"
namespace A {
}
namespace B {
using A::t1;
}
//=== Cpp2 type definitions and function declarations ===========================
#line 1 "test.cpp2"
namespace A {
template<bool> struct t { };
constexpr bool f(const t<true>&) { return true; }
constexpr t<true> o{};
} // namespace ns
t1 is aliases from stage1, but my code will become
#line 9 "test.cpp2"
namespace A {
template<t<CPP2_UFCS_NONLOCAL(f)(o)> UnnamedTypeParam1_1> using t1 = bool;
}
namespace B {
using A::t1;
}
//=== Cpp2 type definitions and function declarations ===========================
#line 1 "test.cpp2"
namespace A {
template<bool> struct t { };
constexpr bool f(const t<true>&) { return true; }
constexpr t<true> o{};
} // namespace ns
Looks it needs to move cpp1 namespace definition before stage0.