Bug 55003 - [C++11] Member function pointer not working as constexpr initializer
Summary: [C++11] Member function pointer not working as constexpr initializer
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 4.7.2
: P3 normal
Target Milestone: 4.8.0
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 55159 (view as bug list)
Depends on:
Blocks: constexpr
  Show dependency treegraph
 
Reported: 2012-10-20 22:12 UTC by Lee McCuller
Modified: 2013-02-15 11:24 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Lee McCuller 2012-10-20 22:12:50 UTC
This piece of code 

template<typename T>
struct MemberGet{
   static constexpr auto assign_operator = static_cast<T & (T::*)(const T &)>(&T::operator=);
};

fails with this error:

error: declaration of ‘constexpr const auto MemberGet<fpga::FPGAFilter>::assign_operator’ has no initializer

on with gcc -v:
Using built-in specs.
COLLECT_GCC=/usr/bin/g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/lto-wrapper
Target: x86_64-unknown-linux-gnu
Configured with: /build/src/gcc-4.7.2/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --enable-libstdcxx-time --enable-gnu-unique-object --enable-linker-build-id --with-ppl --enable-cloog-backend=isl --disable-ppl-version-check --disable-cloog-version-check --enable-lto --enable-gold --enable-ld=default --enable-plugin --with-plugin-ld=ld.gold --with-linker-hash-style=gnu --enable-multilib --disable-libssp --disable-build-with-cxx --disable-build-poststage1-with-cxx --enable-checking=release
Thread model: posix
gcc version 4.7.2 (GCC)


I'm pretty certain that this code is valid C++ as it does compile in clang++ (built on top of this gcc version).
Comment 1 Daniel Krügler 2012-10-21 13:36:28 UTC
The code presented code example seems incomplete, because it is accepted as written. Here a complete code-example compiled with gcc 4.8.0 20121014 (experimental) using the compiler flags

-Wall -std=c++11 -pedantic

//---------------------
template<typename T>
struct MemberGet{
   static constexpr auto assign_operator =
   static_cast<T & (T::*)(const T &)>(&T::operator=);
};

struct X {};

MemberGet<X> mg;
//---------------------

"3|error: declaration of 'constexpr const auto MemberGet<X>::assign_operator' has no initializer|"

I agree that this code should be accepted.
Comment 2 Paolo Carlini 2012-11-07 16:11:28 UTC
*** Bug 55159 has been marked as a duplicate of this bug. ***
Comment 3 Jason Merrill 2013-02-15 01:27:44 UTC
Author: jason
Date: Fri Feb 15 01:27:36 2013
New Revision: 196069

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=196069
Log:
	PR c++/55003
	* decl.c (cp_finish_decl): Force instantiation of an
	auto static data member.

Added:
    trunk/gcc/testsuite/g++.dg/cpp0x/auto37.C
Modified:
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/decl.c
Comment 4 Paolo Carlini 2013-02-15 11:24:22 UTC
Fixed.