[Bug c++/57063] Valid static_cast from data member to rvalue reference fails to compile

2013-04-25 Thread tsoae at mail dot ru


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57063



--- Comment #4 from Nikolka  2013-04-25 13:51:21 UTC ---

It looks like the root of the issue is that static_cast produces an expression

with wrong value category sometimes.



#include 

#include 



#define PRINT_VALUE(...) \

std::cout << #__VA_ARGS__ " = " << __VA_ARGS__ << std::endl



template 

struct X

{

void f()

{

PRINT_VALUE(std::is_lvalue_reference<

decltype(static_cast(value))>{});



PRINT_VALUE(std::is_rvalue_reference<

decltype(static_cast(value))>{});



std::cout << std::endl;

}

T &&value;

};



struct A {};



int main()

{

X{0}.f();

X{A()}.f();

}



When T = int, static_cast(value) is wrongfully treated as an lvalue. In

the first example the compiler thinks that we want to return lvalue of type int

by rvalue reference int &&, which would be invalid.


[Bug c++/57063] Valid static_cast from data member to rvalue reference fails to compile

2013-04-25 Thread tsoae at mail dot ru

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57063

--- Comment #2 from Nikolka  2013-04-25 07:19:20 UTC ---
The alias is added for convenience - we can quickly test handling of different
types so. It seems that there is no problem with class types and function
types, the error arises when T is a scalar type or an array type:

#include 

template 
struct X
{
T &&f()
{
return static_cast(value);
}
T &&value;
};

enum E {};

template class X;
template class X;
template class X;
template class X;
template class X;

test.cpp: In instantiation of ‘T&& X::f() [with T = int]’:
test.cpp:15:20:   required from here
test.cpp:8:43: error: cannot bind ‘int’ lvalue to ‘int&&’
 return static_cast(value);
   ^
test.cpp: In instantiation of ‘T&& X::f() [with T = E]’:
test.cpp:16:20:   required from here
test.cpp:8:43: error: cannot bind ‘E’ lvalue to ‘E&&’
test.cpp: In instantiation of ‘T&& X::f() [with T = int [1]]’:
test.cpp:19:20:   required from here
test.cpp:8:43: error: cannot bind ‘int [1]’ lvalue to ‘int (&&)[1]’

[Bug c++/57063] New: Valid static_cast from data member to rvalue reference fails to compile

2013-04-24 Thread tsoae at mail dot ru

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57063

 Bug #: 57063
   Summary: Valid static_cast from data member to rvalue reference
fails to compile
Classification: Unclassified
   Product: gcc
   Version: 4.8.1
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


G++ 4.8-20130418 fails to compile the following well-formed code:

using T = int;

struct X
{
T &&f()
{
return static_cast(value);
}
T &&value;
};

int main() {}

It issues the following error at the line with static_cast:

cannot bind ‘T {aka int}’ lvalue to ‘T&& {aka int&&}’
 return static_cast(value);

Command line: g++ test.cpp -std=c++11 -pedantic -v
Output:
==
Using built-in specs.
COLLECT_GCC=../builds/gcc-4.8-20130418/target/bin/g++
COLLECT_LTO_WRAPPER=../builds/gcc-4.8-20130418/target/libexec/gcc/i686-pc-linux-gnu/4.8.1/lto-wrapper
Target: i686-pc-linux-gnu
Configured with: ../Downloads/gcc_install/gcc-4.8-20130418/configure
--prefix=../builds/gcc-4.8-20130418/target --enable-languages=c,c++
--disable-werror
Thread model: posix
gcc version 4.8.1 20130418 (prerelease) (GCC) 
COLLECT_GCC_OPTIONS='-std=c++11' '-Wpedantic' '-v' '-shared-libgcc'
'-mtune=generic' '-march=pentiumpro'
 ../builds/gcc-4.8-20130418/target/libexec/gcc/i686-pc-linux-gnu/4.8.1/cc1plus
-quiet -v -D_GNU_SOURCE test.cpp -quiet -dumpbase test.cpp -mtune=generic
-march=pentiumpro -auxbase test -Wpedantic -std=c++11 -version -o
/tmp/cc8uNbtW.s
GNU C++ (GCC) version 4.8.1 20130418 (prerelease) (i686-pc-linux-gnu)
compiled by GNU C version 4.8.1 20130418 (prerelease), GMP version 5.1.1,
MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory
"../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../i686-pc-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../include/c++/4.8.1

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../include/c++/4.8.1/i686-pc-linux-gnu

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/../../../../include/c++/4.8.1/backward
 ../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/include
 /usr/local/include
 ../builds/gcc-4.8-20130418/target/include

../builds/gcc-4.8-20130418/target/lib/gcc/i686-pc-linux-gnu/4.8.1/include-fixed
 /usr/include
End of search list.
GNU C++ (GCC) version 4.8.1 20130418 (prerelease) (i686-pc-linux-gnu)
compiled by GNU C version 4.8.1 20130418 (prerelease), GMP version 5.1.1,
MPFR version 3.1.2, MPC version 1.0.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 0f47b9d9fd89a439a6a420b23c88ecfa
test.cpp: In member function ‘T&& X::f()’:
test.cpp:7:39: error: cannot bind ‘T {aka int}’ lvalue to ‘T&& {aka int&&}’
 return static_cast(value);
   ^

[Bug c++/56192] New: global operator new() vs member operator new()

2013-02-03 Thread tsoae at mail dot ru


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56192



 Bug #: 56192

   Summary: global operator new() vs member operator new()

Classification: Unclassified

   Product: gcc

   Version: 4.8.0

Status: UNCONFIRMED

  Severity: normal

  Priority: P3

 Component: c++

AssignedTo: unassig...@gcc.gnu.org

ReportedBy: ts...@mail.ru





g++ 4.8.0 20130127 fails to compile the following code



#include 



template 

struct A {};



template 

A f(int);



template 

A g(int);



struct X

{

void *operator new(std::size_t n, void *);

};



int main()

{

using type = decltype(g(0));

}



=

Using built-in specs.

COLLECT_GCC=bin/g++

COLLECT_LTO_WRAPPER=libexec/gcc/x86_64-linux-gnu/4.8.0/lto-wrapper

Target: x86_64-linux-gnu

Configured with: ../gcc-4.8-20130127/configure

--prefix=/mnt/compiles/toolchains/cpp/4.8.0 --disable-nls

--enable-languages=c,c++,go,fortran --enable-shared --enable-linker-build-id

--with-system-zlib --without-included-gettext --enable-threads=posix

--enable-clocale=gnu --enable-libstdcxx-time=yes --enable-gnu-unique-object

--enable-plugin --enable-objc-gc --disable-werror --with-tune=generic

--enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu

--target=x86_64-linux-gnu --disable-bootstrap --disable-multilib

--disable-shared --enable-static

Thread model: posix

gcc version 4.8.0 20130127 (experimental) (GCC) 

COLLECT_GCC_OPTIONS='-std=c++11' '-v' '-o' 'program' '-mtune=generic'

'-march=x86-64'

 libexec/gcc/x86_64-linux-gnu/4.8.0/cc1plus -quiet -v -imultilib . -imultiarch

x86_64-linux-gnu -D_GNU_SOURCE source.cpp -quiet -dumpbase source.cpp

-mtune=generic -march=x86-64 -auxbase source -std=c++11 -version -o

/tmp/ccKToF0B.s

GNU C++ (GCC) version 4.8.0 20130127 (experimental) (x86_64-linux-gnu)

compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3,

MPC version 0.9

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072

ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"

ignoring nonexistent directory

"lib/gcc/x86_64-linux-gnu/4.8.0/../../../../x86_64-linux-gnu/include"

#include "..." search starts here:

#include <...> search starts here:

 lib/gcc/x86_64-linux-gnu/4.8.0/../../../../include/c++/4.8.0



lib/gcc/x86_64-linux-gnu/4.8.0/../../../../include/c++/4.8.0/x86_64-linux-gnu/.

 lib/gcc/x86_64-linux-gnu/4.8.0/../../../../include/c++/4.8.0/backward

 lib/gcc/x86_64-linux-gnu/4.8.0/include

 /usr/local/include

 include

 lib/gcc/x86_64-linux-gnu/4.8.0/include-fixed

 x86_64-linux-gnu

 /usr/include

End of search list.

GNU C++ (GCC) version 4.8.0 20130127 (experimental) (x86_64-linux-gnu)

compiled by GNU C version 4.7.2, GMP version 5.0.2, MPFR version 3.1.0-p3,

MPC version 0.9

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072

Compiler executable checksum: c50b4a9e751f2a9ab933b25f6962a9bf

source.cpp: In function 'int main()':

source.cpp:19:33: error: no matching function for call to 'g(int)'

 using type = decltype(g(0));



 ^

source.cpp:19:33: note: candidate is:

source.cpp:10:26: note: template A g(int)

 A g(int);



  ^

source.cpp:10:26: note:   template argument deduction/substitution failed:

source.cpp: In substitution of 'template A g(int)

[with T = ]':

source.cpp:19:33:   required from here

source.cpp:10:26: error: no matching function for call to 'X::operator

new(sizetype)'

source.cpp:10:26: note: candidate is:

source.cpp:14:11: note: static void* X::operator new(std::size_t, void*)

 void *operator new(std::size_t n, void *);



   ^

source.cpp:14:11: note:   candidate expects 2 arguments, 1 provided

source.cpp:19:33: error: no matching function for call to 'g(int)'

 using type = decltype(g(0));



 ^

source.cpp:19:33: note: candidate is:

source.cpp:10:26: note: template A g(int)

 A g(int);



  ^

source.cpp:10:26: note:   template argument deduction/substitution failed:

source.cpp: In substitution of 'template A g(int)

[with T = ]':

source.cpp:19:33:   required from here

source.cpp:10:26: error: no matching function for call to 'X::operator

new(sizetype)'

source.cpp:10:26: note: candidate is:

source.cpp:14:11: note: static void* X::operator new(std::size_t, void*)

 void *operator new(std::size_t n, void *);



   ^

source.cpp:14:11: note:   candidate expects 2 arguments, 1 provided

=



The compiler ignores the presence of :: before new in the declaration of g and

tries to find X::operator new() there. If we remove the declaration of f, the

lookup for operator new() will be performed

[Bug c++/54543] New: Expression (condition ? array : throw expr)[index] fails to compile

2012-09-10 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54543

 Bug #: 54543
   Summary: Expression (condition ? array : throw expr)[index]
fails to compile
Classification: Unclassified
   Product: gcc
   Version: 4.8.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


g++ 4.8.0 20120909 (experimental) fails to compile the following well-defined
code:

int f(int (&arr)[10], int n)
{
return ((0 <= n && n < 10) ? arr : throw "error")[n];
}

int main() {}

COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=pentiumpro'

test.cpp: In function ‘int f(int (&)[10], int)’:
test.cpp:3:46: error: void value not ignored as it ought to be
 return ((0 <= n && n < 10) ? arr : throw "error")[n];
  ^

Compiler version info:

Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=../target --enable-languages=c,c++
Thread model: posix
GNU C++ (GCC) version 4.8.0 20120909 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 4.8.0 20120909 (experimental), GMP version 5.0.2,
MPFR version 3.1.0, MPC version 0.8.2


[Bug c++/54542] New: SFINAE bug: handling new expressions

2012-09-10 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54542

 Bug #: 54542
   Summary: SFINAE bug: handling new expressions
Classification: Unclassified
   Product: gcc
   Version: 4.8.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


g++ 4.8.0 20120909 (experimental) fails to compile the following well-defined
code:

template 
void f(decltype(new T(1, 2)) *)
{
T(1, 2);
}
template 
void f(...)
{}

int main()
{
f(0);
}

COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=pentiumpro'

test.cpp: In substitution of ‘template void f(decltype (new T)*) [with
T = ]’:
test.cpp:12:17:   required from here
test.cpp:2:14: error: new initializer expression list treated as compound
expression [-fpermissive]
 void f(decltype(new T(1, 2)) *)
  ^
test.cpp: In substitution of ‘template void f(decltype (new T)*) [with
T = int]’:
test.cpp:12:17:   required from here
test.cpp:2:14: error: new initializer expression list treated as compound
expression [-fpermissive]
test.cpp:2:38: error: new initializer expression list treated as compound
expression [-fpermissive]
 void f(decltype(new T(1, 2)) *)
  ^
‘
Internal compiler error: Error reporting routines re-entered.

Compiler version info:

Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=../target --enable-languages=c,c++
Thread model: posix
GNU C++ (GCC) version 4.8.0 20120909 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 4.8.0 20120909 (experimental), GMP version 5.0.2,
MPFR version 3.1.0, MPC version 0.8.2

Explanation:

When T is int, the new-expression is ill-formed and the error occurs in
immediate context, so the former f should be excluded from the set of candidate
functions due to substitution failure.


[Bug c++/54541] New: SFINAE bug: handling incomplete return types

2012-09-10 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54541

 Bug #: 54541
   Summary: SFINAE bug: handling incomplete return types
Classification: Unclassified
   Product: gcc
   Version: 4.8.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


g++ 4.8.0 20120909 (experimental) fails to compile the following well-defined
code:

#include 

struct X;

X f(int);

template 
void g(decltype((void)f(std::declval())) *)
{}
template 
void g(...)
{}

int main()
{
g(0);
}

COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=pentiumpro'

test.cpp: In substitution of ‘template void g(decltype
((void)(f(declval(*) [with T = ]’:
test.cpp:16:17:   required from here
test.cpp:8:50: error: invalid use of incomplete type ‘struct X’
 void g(decltype((void)f(std::declval())) *)
  ^
test.cpp:3:12: error: forward declaration of ‘struct X’
 struct X;
^

Compiler version info:

Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=../target --enable-languages=c,c++
Thread model: posix
GNU C++ (GCC) version 4.8.0 20120909 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 4.8.0 20120909 (experimental), GMP version 5.0.2,
MPFR version 3.1.0, MPC version 0.8.2

Explanation:

When considering g(0), for the former g the error [the expression
(void)f(std::declval()) uses incomplete type X in a context where complete
type is required] occurs in immediate context (and there are no any errors in
non-immediate context), so the former g should be just excluded from the set of
candidate functions due to substitution failure. The latter g is the only
viable candidate, so it should be called.


[Bug c++/51317] [C++0x] [DR 587] Wrong value category of conditional expression where lvalue operands differ only in cv-qualification

2012-09-10 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51317

Nikolka  changed:

   What|Removed |Added

Version|4.7.0   |4.8.0

--- Comment #1 from Nikolka  2012-09-10 17:16:46 UTC ---
The error still occurs on g++ v.4.7.2 20120908 (prerelease) and v.4.8.0
20120909 (experimental).

-4.7.2-

Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=../target --enable-languages=c,c++
Thread model: posix
GNU C++ (GCC) version 4.7.2 20120908 (prerelease) (i686-pc-linux-gnu)
compiled by GNU C version 4.7.2 20120908 (prerelease), GMP version 5.0.2,
MPFR version 3.1.0, MPC version 0.8.2

COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=pentiumpro'

test.cpp:3:27: error: lvalue required as unary ‘&’ operand

-4.8.0-

Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=../target --enable-languages=c,c++
Thread model: posix
GNU C++ (GCC) version 4.8.0 20120909 (experimental) (i686-pc-linux-gnu)
compiled by GNU C version 4.8.0 20120909 (experimental), GMP version 5.0.2,
MPFR version 3.1.0, MPC version 0.8.2

COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=pentiumpro'

test.cpp:3:27: error: lvalue required as unary ‘&’ operand
 int const *p = &(1 ? x : y);
   ^


[Bug c++/54506] Defaulted move constructors and move assignment operators are erroneously defined as deleted

2012-09-09 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54506

--- Comment #8 from Nikolka  2012-09-10 06:26:02 UTC ---
(In reply to comment #7)
> (In reply to comment #3)
> > g++ v4.7.2 20120908 (prerelease) compiles the original example successfully,
> > but it fails to compile the following code:
> 
> G++ is following the proposed resolution of DR 1402 here; A does not have
> a move constructor

A does have a move constructor, which is instantiated from

A(A const volatile &&) = delete;

See 12.8/3:

A non-template constructor for class X is a move constructor if its first
parameter is of type X&&, const X&&, volatile X&&, or const volatile X&&, and
either there are no other parameters or else all other parameters have default
arguments


[Bug c++/54506] Defaulted move constructors and move assignment operators are erroneously defined as deleted

2012-09-09 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54506

--- Comment #5 from Nikolka  2012-09-09 22:42:03 UTC ---
(In reply to comment #4)

These examples aren't similar. An implicitly defined move constructor performs
direct-initialization of non-static data members with the corresponding members
of the argument, which is interpreted as xvalue (12.8/15). In every such a
direct-initialization all constructors are considered (13.3.1.3), including
constructor templates. Template argument for the parameter U can be deduced as
int, and the produced specialization of the constructor template will have
better match than both copy and move constructors.

Similarly for assignment operators.

> struct A cannot be moved because its move operations are deleted

This is not so in my example, and g++ correctly handles the following case:

template 
struct A
{
A() {}

A(A const volatile &&) = delete;
A &operator =(A const volatile &&) = delete;

template 
A(A &&) {}
template 
A &operator =(A &&) { return *this; }
};

int main()
{
A a = A(); // OK
a = A(); // OK
}


[Bug c++/54506] Defaulted move constructors and move assignment operators are erroneously defined as deleted

2012-09-09 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54506

--- Comment #3 from Nikolka  2012-09-09 20:55:38 UTC ---
g++ v4.7.2 20120908 (prerelease) compiles the original example successfully,
but it fails to compile the following code:

template 
struct A
{
A() {}

A(A const volatile &&) = delete;
A &operator =(A const volatile &&) = delete;

template 
A(A &&) {}
template 
A &operator =(A &&) { return *this; }
};

struct B
{
A a;
B() = default;
};

int main()
{
B b = B();
b = B();
}

Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=../target --enable-languages=c,c++
Thread model: posix
gcc version 4.7.2 20120908 (prerelease) (GCC) 
COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-shared-libgcc' '-mtune=generic'
'-march=pentiumpro'
 ../target/libexec/gcc/i686-pc-linux-gnu/4.7.2/cc1plus -quiet -v -D_GNU_SOURCE
test.cpp -quiet -dumpbase test.cpp -mtune=generic -march=pentiumpro -auxbase
test -std=c++11 -version -o /tmp/cc0973J0.s
GNU C++ (GCC) version 4.7.2 20120908 (prerelease) (i686-pc-linux-gnu)
compiled by GNU C version 4.7.2 20120908 (prerelease), GMP version 5.0.2,
MPFR version 3.1.0, MPC version 0.8.2

test.cpp: In function ‘int main()’:
test.cpp:23:17: error: use of deleted function ‘B::B(const B&)’
test.cpp:15:12: note: ‘B::B(const B&)’ is implicitly deleted because the
default definition would be ill-formed:
test.cpp:15:12: error: use of deleted function ‘constexpr A::A(const
A&)’
test.cpp:2:16: note: ‘constexpr A::A(const A&)’ is implicitly
declared as deleted because ‘A’ declares a move constructor or move
assignment operator
test.cpp:24:15: error: use of deleted function ‘B& B::operator=(const B&)’
test.cpp:15:12: note: ‘B& B::operator=(const B&)’ is implicitly deleted because
the default definition would be ill-formed:
test.cpp:15:12: error: use of deleted function ‘A& A::operator=(const
A&)’
test.cpp:2:16: note: ‘A& A::operator=(const A&)’ is implicitly
declared as deleted because ‘A’ declares a move constructor or move
assignment operator


[Bug c++/54521] g++ fails to call explicit constructors in the second step of copy initialization

2012-09-08 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54521

--- Comment #3 from Nikolka  2012-09-08 13:25:20 UTC ---
In both cases (for g++ v4.7.1 and v4.8.0) the only compiler option was
-std=c++11. Nothing magical.


[Bug c++/54526] New: <:: is incorrectly treated as digraph <: followed by colon

2012-09-08 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54526

 Bug #: 54526
   Summary: <:: is incorrectly treated as digraph <: followed by
colon
Classification: Unclassified
   Product: gcc
   Version: 4.8.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


g++ 4.8.0 20120826 (experimental) fails to compile the following well-defined
code:

template 
struct X {};

struct A {};

int main()
{
X<::A> x; // error: ‘<::’ cannot begin a template-argument list
}

According to C++11 - 2.5 p3, bullet 2:

If the input stream has been parsed into preprocessing tokens up to a given
character:
... if the next three characters are <:: and the subsequent character is
neither : nor >, the < is treated as a preprocessor token by itself and not as
the first character of the alternative token <:.

Compiler version info:

Target: i686-pc-linux-gnu
Configured with: .../configure --prefix=.../target --enable-languages=c,c++
Thread model: posix
gcc version 4.8.0 20120826 (experimental) (GCC)

Command line:

g++ test.cpp -std=c++11 -pedantic-errors

Diagnostic message:

test.cpp: In function ‘int main()’:
test.cpp:8:10: error: ‘<::’ cannot begin a template-argument list
[-fpermissive]
 X<::A> x;
  ^
test.cpp:8:10: note: ‘<:’ is an alternate spelling for ‘[’. Insert whitespace
between ‘<’ and ‘::’
test.cpp:8:10: note: (if you use ‘-fpermissive’ G++ will accept your code)


[Bug c++/54521] g++ fails to call explicit constructors in the second step of copy initialization

2012-09-08 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54521

--- Comment #2 from Nikolka  2012-09-08 12:36:29 UTC ---
(In reply to comment #1)
> Works fine with 4.6.3, 4.7.2 20120716 (prerelease) and 
> 4.8.0 20120716 (experimental)
> 
> As requested when submitting the bug, please provide the information requested
> at http://gcc.gnu.org/bugs/ including the command line and output of gcc -v

1) Version info:

Target: i686-pc-mingw32
Configured with: ../src/configure --prefix=/c/temp/gcc/dest
--with-gmp=/c/temp/gcc/gmp --with-mpfr=/c/temp/gcc/mpfr
--with-mpc=/c/temp/gcc/mpc --enable-languages=c,c++ --with-arch=i686
--with-tune=generic --disable-libstdcxx-pch --disable-nls --disable-shared
--disable-sjlj-exceptions --disable-win32-registry --enable-checking=release
--enable-lto
Thread model: win32
gcc version 4.7.1 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-std=c++11' '-mtune=generic' '-march=i686'

c:/common/c++/mingw/mingw-gcc-4.7.1/bin/../libexec/gcc/i686-pc-mingw32/4.7.1/cc1plus.exe
-quiet -v -iprefix ..\bin\../lib/gcc/i686-pc-mingw32/4.7.1/ test.cpp -quiet
-dumpbase test.cpp -mtune=generic -march=i686 -auxbase test -std=c++11 -version
-o
GNU C++ (GCC) version 4.7.1 (i686-pc-mingw32)
compiled by GNU C version 4.7.1, GMP version 5.0.5, MPFR version 3.1.0-p10,
MPC version 0.9

Diagnostic message:

test.cpp: In function 'int main()':
test.cpp:9:15: error: no matching function for call to 'X::X(X)'
test.cpp:9:15: note: candidate is:
test.cpp:3:9: note: X::X(int)
test.cpp:3:9: note:   no known conversion for argument 1 from 'X' to 'int'

2) Version info:

Target: i686-pc-linux-gnu
Configured with: .../configure --prefix=.../target --enable-languages=c,c++
Thread model: posix
gcc version 4.8.0 20120826 (experimental) (GCC)

Diagnostic message:

test.cpp: In function ‘int main()’:
test.cpp:9:15: error: no matching function for call to ‘X::X(X)’
 X x = 1; // error: no matching function for call to 'X::X(X)'
   ^
test.cpp:9:15: note: candidate is:
test.cpp:3:9: note: X::X(int)
 X(int) {}
 ^
test.cpp:3:9: note:   no known conversion for argument 1 from ‘X’ to ‘int’


[Bug c++/54506] Defaulted move constructors and move assignment operators are erroneously defined as deleted

2012-09-08 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54506

--- Comment #2 from Nikolka  2012-09-08 12:17:24 UTC ---
(In reply to comment #1)
> How are you calling g++?

/mingw-gcc-4.7.1/bin/g++ test.cpp -std=c++11

> What version are you using?

Target: i686-pc-mingw32
Configured with: ../src/configure --prefix=/c/temp/gcc/dest
--with-gmp=/c/temp/gcc/gmp --with-mpfr=/c/temp/gcc/mpfr
--with-mpc=/c/temp/gcc/mpc --enable-languages=c,c++ --with-arch=i686
--with-tune=generic --disable-libstdcxx-pch --disable-nls --disable-shared
--disable-sjlj-exceptions --disable-win32-registry --enable-checking=release
--enable-lto
Thread model: win32
gcc version 4.7.1 (GCC) 

> What is the diagnostic you get?

test.cpp: In function 'int main()':
test.cpp:25:17: error: use of deleted function 'B::B(B&&)'
test.cpp:19:9: note: 'B::B(B&&)' is implicitly deleted because the default
definition would be ill-formed:
test.cpp:19:9: error: non-static data member 'B::a' does not have a move
constructor or trivial copy constructor
test.cpp:26:15: error: use of deleted function 'B& B::operator=(B&&)'
test.cpp:20:12: note: 'B& B::operator=(B&&)' is implicitly deleted because the
default definition would be ill-formed:
test.cpp:20:12: error: non-static data member 'B::a' does not have a move
assignment operator or trivial copy assignment operator


[Bug c++/54521] New: g++ fails to call explicit constructors in the second step of copy initialization

2012-09-07 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54521

 Bug #: 54521
   Summary: g++ fails to call explicit constructors in the second
step of copy initialization
Classification: Unclassified
   Product: gcc
   Version: 4.7.1
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


g++ fails to compile the following code

struct X
{
X(int) {}
explicit X(X const &) {}
};

int main()
{
X x = 1; // error: no matching function for call to 'X::X(X)'
}

The second step of a copy initialization (see 8.5/16/6/2) is a
direct-initialization where explicit constructors shall be considered as
candidate functions.


[Bug c++/54506] New: Defaulted move constructors and move assignment operators are erroneously defined as deleted

2012-09-06 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54506

 Bug #: 54506
   Summary: Defaulted move constructors and move assignment
operators are erroneously defined as deleted
Classification: Unclassified
   Product: gcc
   Version: 4.7.1
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


g++ rejects the following well-formed code:

template 
struct A
{
A() {}

A(A const volatile &&) = delete;
A &operator =(A const volatile &&) = delete;

template 
A(A &&) {}
template 
A &operator =(A &&) { return *this; }
};

struct B
{
A a;
B() = default;
B(B &&) = default;
B &operator =(B &&) = default;
};

int main()
{
B b = B();
b = B();
}
The compiler says that the defaulted move functions in B are deleted, however
12.8/11 and 12.8/23 do not define such functions as deleted.


[Bug c++/52625] Incorrect specialization semantics of friend class template declaration

2012-03-20 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52625

Nikolka  changed:

   What|Removed |Added

 CC||tsoae at mail dot ru

--- Comment #1 from Nikolka  2012-03-20 07:34:03 UTC ---
G++ issues the same diagnostic message for the following example:

template
class base {};

class derived : public base
{
// error: specialization of 'base' after instantiation
template
friend class base;
};

It seems that in the original example g++ incorrectly treats the
injected-class-name ::base::base as template specialization
base, while according to 14.6.1/1 it shall be refer to class template
base. Note that g++ does not issue an error in the following case:

template
class base {};

class derived : public base
{
template
friend class ::base;
};

int main() {}


[Bug c++/51316] alignof doesn't work with arrays of unknown bound

2011-12-28 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51316

--- Comment #5 from Nikolka  2011-12-28 22:06:18 UTC ---
> On it.

There is an active core issue about alignof:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3309.html#1305

Probably, you should take into account the proposed resolution.


[Bug c++/51316] alignof doesn't work with arrays of unknown bound

2011-11-27 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51316

--- Comment #2 from Nikolka  2011-11-27 08:37:37 UTC ---
> Note that this usage is not valid in C1X.

Could you explain?


[Bug c++/51317] New: Wrong value category of conditional expression where lvalue operands differ only in cv-qualification (see DR 587)

2011-11-26 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51317

 Bug #: 51317
   Summary: Wrong value category of conditional expression where
lvalue operands differ only in cv-qualification (see
DR 587)
Classification: Unclassified
   Product: gcc
   Version: 4.7.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


GCC 4.7.0 rejects the following application of address-of operator:

int x = 1;
int const y = 2;
int const *p = &(1 ? x : y); // error: lvalue required as unary '&' operand

Such behavior was correct in C++03, but it is incorrect in C++11 - see
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#587


[Bug c++/51316] New: alignof doesn't work with arrays of unknown bound

2011-11-26 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51316

 Bug #: 51316
   Summary: alignof doesn't work with arrays of unknown bound
Classification: Unclassified
   Product: gcc
   Version: 4.7.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


gcc 4.7.0 rejects the following code:

int main()
{
// error: invalid application of '__alignof__' to incomplete type 'int
[]'
alignof(int []);
}

5.3.6/1:

An alignof expression yields the alignment requirement of its operand type.
The operand shall be a type-id representing a complete object type or an array
thereof or a reference to a complete object type.

int[] is array of complete object type.


[Bug c++/51312] Wrong interpretation of converted constant expressions (for template arguments and enumerator initializers)

2011-11-26 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51312

--- Comment #2 from Nikolka  2011-11-26 15:33:36 UTC ---
> For the first one, you should write X{} instead of X() which looks too much
like a function type.

I agree, that was my mistake.


[Bug c++/51312] New: Wrong interpretation of converted constant expressions (for template arguments and enumerator initializers)

2011-11-26 Thread tsoae at mail dot ru
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51312

 Bug #: 51312
   Summary: Wrong interpretation of converted constant expressions
(for template arguments and enumerator initializers)
Classification: Unclassified
   Product: gcc
   Version: 4.7.0
Status: UNCONFIRMED
  Severity: normal
  Priority: P3
 Component: c++
AssignedTo: unassig...@gcc.gnu.org
ReportedBy: ts...@mail.ru


GNU C++ 4.7.0 fails to compile the following well-defined code:

struct X
{
constexpr operator int()
{ return true; }
};

template 
struct A {};

int main()
{
// error: expected a constant of type 'int', got 'X()'
A();

// error: enumerator value for 'e' is not an integer constant
enum : int { e = X() };
}

In both cases a converted constant expression of type int is required (see
14.3.2/1/1 and 7.2/5). According to 5.19/3, X() can be used in a context where
a converted constant expression of type int is required.