GCC-5 C++14: Ist das ein Bug?

OP #4072133
Lesenswert?
• ▲
▼
Ich wollte mal etwas mit c++14 experimentieren und bin mir nicht sicher 
ob ich einen Bug in gcc-5 gefunden habe, oder mein Code irgendeine C++ 
Regel verletzt.

GCC Version:
1
gcc (Ubuntu 5-20150328-0ubuntu11) 5.0.0 20150328 (experimental) [trunk revision 221753]
2
Copyright (C) 2015 Free Software Foundation, Inc.
3
This is free software; see the source for copying conditions.  There is NO
4
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Den GCC hab ich von hier:
https://launchpad.net/~ubuntu-toolchain-r/+archive/ubuntu/test

Mein Code:
1
#include <iostream>
2

3
template<typename T,std::size_t S>
4
struct arr {
5
  typedef T Type;
6
  Type data[S];
7
  static constexpr std::size_t size(){
8
    return S;
9
  }
10
};
11

12
constexpr auto y(){
13
  auto a = arr<char,'Z'-'A'+2>();
14
  for(std::size_t i=0;i<a.size();i++)
15
    a.data[i] = 'A'+i;
16
  a.data[a.size()-1] = 0;
17
  return a;
18
}

Meine nicht funktionierende main:
1
auto r = y();
2
// oder: const auto r = y();
3
// oder: constexpr auto r = y();
4
// oder: const constexpr auto r = y();
5

6
int main(){
7
  // Ergibt nur eine Leerzeile als Ausgabe, erwarte Buchstaben A bis Z
8
  std::cout << r.data << std::endl;
9
  return 0;
10
}

Meine zweite nicht funktionierende main:
1
int main(){
2
  auto r = y().data;
3
  std::cout << r << std::endl; // Gibt das zeiche '@' aus
4
  return 0;
5
}

Meine funktionierende main:
1
int main(){
2
  auto r = y();
3
  // gibt "ABCDEFGHIJKLMNOPQRSTUVWXYZ" aus
4
  std::cout << r.date << std::endl; 
5
  return 0;
6
}

Meine zweite funktionierende main:
1
int main(){
2
  auto r = y();
3
  // gibt "ABCDEFGHIJKLMNOPQRSTUVWXYZ" aus
4
  std::cout << y().date << std::endl; 
5
  return 0;
6
}

Mache ich irgendetwas falsch, oder ist das ein compilerbug?
Gast #4072161
Lesenswert?
• ▲
▼
Hallo,
das ist ein Bug im Compiler.
Meiner kommt gar nicht so weit:
1
ich@utopic:/tmp$ /opt/gcc-5/bin/g++ -std=c++14 -Wall -Wextra -pedantic -o test test.cpp
2
test.cpp:20:12:   in constexpr expansion of »y()«
3
test.cpp:20:12: interner Compiler-Fehler: in cxx_eval_constant_expression, bei cp/constexpr.c:2912
4
 auto r = y();
5
            ^
6
0x7dc58e cxx_eval_constant_expression
7
  ../../source/gcc/cp/constexpr.c:2912
8
...
Aber ein aktueller aus dem SVN gebauter clang machts fehlerfrei.
#4072447
Lesenswert?
• ▲
▼
Daniel A. schrieb:
> Meine zweite nicht funktionierende main:int main(){
>   auto r = y().data;
>   std::cout << r << std::endl; // Gibt das zeiche '@' aus
>   return 0;
> }

Auch wenn ich c++14 nicht genau kenne (und mich gerade erst in c++11 
einarbeite): r dürfte doch ein Zeiger auf das erste Element des Arrays 
im von y zurückgegebenen Objekt sein, das aber in der nächsten Zeile 
nicht mehr existiert.

Oliver S. schrieb:
>> Mache ich irgendetwas falsch, oder ist das ein compilerbug?
>
> Nun, warum wohl steht in der gcc-Version was von "experimental"?

Ähm, weil es gut sein kann, dass es am Compiler liegt, wenn was nicht 
funktioniert? Gerade deshalb kam ja wohl die Frage.
Gast #4072482
Lesenswert?
• ▲
▼
Oliver S. schrieb:
> Nun, warum wohl steht in der gcc-Version was von "experimental"?

Das bedeutet zunächst, dass der Compiler noch nicht ausreichend getestet 
wurde und anzunehmen ist, dass einiges noch nicht ganz rund läuft.

Dennoch ist die Frage
Rolf Magnus schrieb:
> Mache ich irgendetwas falsch, oder ist das ein compilerbug?

berechtigt,
weil "experimental" nicht beduetet, dass automatisch alles was seltsam 
läuft automatisch ein Compilerbug ist.

Wolltest wieder bisl rumrotzen?
Admin Persönliche Seite #4073908
Lesenswert?
• ▲
▼
Alle Versionen mit Ausnahme der zweiten sind richtig und kompilieren 
einwandfrei mit clang. Die falsche kompiliert zwar auch, aber mit 
Warnung:
1
int main(){
2
  auto r = y().data; // clang warning: "pointer is initialized by a temporary array, which will be destroyed at the end of the full-expression"
3
  std::cout << r << std::endl; // Gibt das zeiche '@' aus
4
  return 0;
5
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren