Skip to content

Commit 2de7fec

Browse files
committed
C++ front-end: Distinguish references from rvalue references
Template specialisation previously would produce the same symbol name for both template<typename T> struct S<T&> as well as template<typename T> struct S<T&&>. As Visual Studio uses both of these in system headers, any test involving includes failed on Windows.
1 parent 75216f4 commit 2de7fec

File tree

2 files changed

+13
-5
lines changed

2 files changed

+13
-5
lines changed

buildspec-windows.yml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@ phases:
4848
Remove-Item cbmc\byte_update6 -Force -Recurse
4949
Remove-Item cbmc\byte_update7 -Force -Recurse
5050
Remove-Item cbmc-library\pipe-01 -Force -Recurse
51-
Remove-Item cpp -Force -Recurse
52-
Remove-Item cbmc-cpp -Force -Recurse
53-
Remove-Item goto-gcc -Force -Recurse
54-
Remove-Item systemc -Force -Recurse
51+
Remove-Item cpp\virtual1 -Force -Recurse
5552
Remove-Item goto-instrument\slice08 -Force -Recurse
5653
cd ..
5754
cd jbmc/regression

src/cpp/cpp_type2name.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,18 @@ static void irep2name(const irept &irep, std::string &result)
3333
if(is_reference(static_cast<const typet&>(irep)))
3434
result+="reference";
3535

36-
if(irep.id()!="")
36+
if(is_rvalue_reference(static_cast<const typet &>(irep)))
37+
result += "rvalue_reference";
38+
39+
if(irep.id() == ID_frontend_pointer)
40+
{
41+
if(irep.get_bool(ID_C_reference))
42+
result += "reference";
43+
44+
if(irep.get_bool(ID_C_rvalue_reference))
45+
result += "rvalue_reference";
46+
}
47+
else if(!irep.id().empty())
3748
result+=do_prefix(irep.id_string());
3849

3950
if(irep.get_named_sub().empty() && irep.get_sub().empty())

0 commit comments

Comments
 (0)