This problem originates in peren_c++. The test (Sec13/3_1_3/P13290.C) exercising the following clause: ISO/IEC 14882:1998, 13.3.1.3. (When a user-defined conversion is invoked to convert an assignment-expression to a type cv T, where T is a class type, a constructor of T is considered a candidate function by overload resolution.)
Simplified test case is: #include <stdio.h> int counter = 0; struct S { int m; S(int i=0) : m(i) { counter++; } }; main(){ counter = 0; S s00 = 1; fprintf(stderr,"counter = (%d)\n",counter); counter = 0; volatile S s02 = 1; fprintf(stderr,"volatile counter = (%d)\n",counter); } to compile: g++ P13290_short.C The error massage is: P13290_short.C: In function ?int main()?: P13290_short.C:23: error: no matching function for call to ?S::S(volatile S)? P13290_short.C:9: note: candidates are: S::S(int) P13290_short.C:6: note: S::S(const S&) It will also fail for "const volatile S s02 = 1;" It is passing with 3.4.6 but fails on 4.3.2 and 4.4.0. The 4.4.0 platform is plain vanilla x86 (x86_64-unknown-linux-gnu). I got it just to verify the issue so you can refer to a supported platform. Thanks. -- Summary: Fail to use constructor to initialize volatile declaration (no matching function for call) Product: gcc Version: 4.3.2 Status: UNCONFIRMED Severity: major Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: sergei_lus at yahoo dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39982