[llvm-dev] Clang++: No member name 'make_unique' in namespace 'std'

David Blaikie via llvm-dev llvm-dev at lists.llvm.org
Thu Feb 11 15:22:27 PST 2021


On Thu, Feb 11, 2021 at 3:19 PM Mehdi AMINI <joker.eph at gmail.com> wrote:
>
>
>
> On Thu, Feb 11, 2021 at 3:08 PM David Blaikie via llvm-dev <llvm-dev at lists.llvm.org> wrote:
>>
>> On Thu, Feb 11, 2021 at 2:53 PM users users <usertestexamples at gmail.com> wrote:
>> >
>> > Hi David,
>> >
>> > Thank you so much for your quick response!
>> > I am very inexperienced with llvm. Please bear with me if my questions look stupid:
>> >
>> > 1. Here is the output from the command ss"clang++ -v":
>> >
>> >
>> > $ clang++ -v
>> >
>> > clang version 12.0.0 (... .../llvm/llvm-project_git/clang 36263a7cccc0d98afc36dea55e7a004d08455811)
>> >
>> > Target: powerpc64le-unknown-linux-gnu
>> >
>> > Thread model: posix
>> >
>> > InstalledDir: ... .../llvm/llvm-project_git/build_12.0.0_36263a7_010421/bin
>> >
>> > Found candidate GCC installation: /usr/lib/gcc/ppc64le-redhat-linux/4.8.2
>> >
>> > Found candidate GCC installation: /usr/lib/gcc/ppc64le-redhat-linux/4.8.5
>> >
>> > Selected GCC installation: /usr/lib/gcc/ppc64le-redhat-linux/4.8.5
>> >
>> > Candidate multilib: .;@m64
>> >
>> > Selected multilib: .;@m64
>> >
>> >
>> > Before using clang++, I removed gcc modules, because I thought clang++ should not be dependent of any host compiler once it was built successfully. Or does it need to make my host compiler (such as gcc/8.2.0) available to it so that to compile my project?
>>
>> I think you may need to pass -stdlib=libc++ to use the libc++ you
>> built/installed, rather than the system libstdc++ which looks a bit
>> out of date (& so doesn't have std::make_unique).
>>
>> >
>> > 2.  Here are the options I used to build llvm:
>> >  -DLLVM_ENABLE_PROJECTS="clang;libcxx;libcxxabi;openmp;parallel-libs" -DCMAKE_BUILD_TYPE="Release" -DLLVM_TARGETS_TO_BUILD=PowerPC -DLLVM_ENABLE_LIBPFM=OFF -DRUN_HAVE_GNU_POSIX_REGEX=0 -DRUN_HAVE_THREAD_SAFETY_ATTRIBUTES=0 -Wno-dev ../llvm
>> > Are these correct options to use?
>>
>> Mostly right except you probably want/need
>> -DLLVM_ENABLE_ASSERTIONS=Off if you want a production-speed compiler.
>
>
> This is implied by `-DCMAKE_BUILD_TYPE="Release"`: https://github.com/llvm/llvm-project/blob/main/llvm/CMakeLists.txt#L412-L416

Ah, huh. Then I'm not sure what else would account for the slow runtime.

>
>>
>>
>> >
>> > Please advise. Thank you so much David!
>> >
>> > Best,
>> > Shelton
>> >
>> >
>> >
>> > On Thu, Feb 11, 2021 at 4:26 PM David Blaikie <dblaikie at gmail.com> wrote:
>> >>
>> >> 1) clang++ -v will show you which standard library headers it's using,
>> >> it might be using an older standard library on your system that
>> >> doesn't have std::make_unique.
>> >> 2) Did you build the compiler in release mode, or in debug mode? (with
>> >> or without assertions enabled)
>> >>
>> >> On Thu, Feb 11, 2021 at 2:21 PM users users via llvm-dev
>> >> <llvm-dev at lists.llvm.org> wrote:
>> >> >
>> >> > Dear LLVM Developers:
>> >> >
>> >> > 1.   Recently I built llvm/12.0 on IBM power8 using gcc/8.2.0. When I run clang++ with an example from https://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique:
>> >> >
>> >> >  #include <iostream>
>> >> >
>> >> > #include <iomanip>
>> >> > #include <memory>
>> >> >
>> >> > struct Vec3
>> >> > {
>> >> >     int x, y, z;
>> >> >
>> >> >     // following constructor is no longer needed since C++20
>> >> >     Vec3(int x = 0, int y = 0, int z = 0) noexcept : x(x), y(y), z(z) { }
>> >> >
>> >> >     friend std::ostream& operator<<(std::ostream& os, const Vec3& v) {
>> >> >         return os << "{ x=" << v.x << ", y=" << v.y << ", z=" << v.z << " }";
>> >> >     }
>> >> > };
>> >> >
>> >> > int main()
>> >> > {
>> >> >     // Use the default constructor.
>> >> >     std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
>> >> >     // Use the constructor that matches these arguments
>> >> >     std::unique_ptr<Vec3> v2 = std::make_unique<Vec3>(0,1,2);
>> >> >     // Create a unique_ptr to an array of 5 elements
>> >> >     std::unique_ptr<Vec3[]> v3 = std::make_unique<Vec3[]>(5);
>> >> >
>> >> >     std::cout << "make_unique<Vec3>():      " << *v1 << '\n'
>> >> >               << "make_unique<Vec3>(0,1,2): " << *v2 << '\n'
>> >> >               << "make_unique<Vec3[]>(5):   ";
>> >> >     for (int i = 0; i < 5; i++) {
>> >> >         std::cout << std::setw(i ? 30 : 0) << v3[i] << '\n';
>> >> >     }
>> >> > }
>> >> >
>> >> >
>> >> > It failed with the following errors:
>> >> >     Error: no member named 'make_unique' in namespace 'std'
>> >> >        std::unique_ptr<Vec3> v1 = std::make_unique<Vec3>();
>> >> >     ... ...
>> >> >
>> >> > Any idea and suggestion about what is going on? or have I missed something? The command I used to compile the code above:
>> >> >      $ clang++ a.cpp
>> >> >
>> >> > 2.  Comparing this llvm with my current gcc/8.2.0 on a project (openmp code running 1 thread), it showed that llvm is almost twice as slow as gcc (both compile with -O3) on my IBM power8 machine. Is it suppose to be with such slower performance than gcc?
>> >> >
>> >> > Thank you very much for any advice!
>> >> >
>> >> > Best Regards,
>> >> > Shelton
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> >
>> >> > _______________________________________________
>> >> > LLVM Developers mailing list
>> >> > llvm-dev at lists.llvm.org
>> >> > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>> _______________________________________________
>> LLVM Developers mailing list
>> llvm-dev at lists.llvm.org
>> https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list