Skip to content

Commit fafe4d9

Browse files
committed
C++ front-end: support =delete method declarations
This enables us to use use cassert instead of assert.h in C++ regression tests, as Visual Studio's header files make use of this. =delete and =default are C++11 (and later) only, make sure the parser is sufficiently restrictive.
1 parent e3de3f6 commit fafe4d9

File tree

14 files changed

+69
-10
lines changed

14 files changed

+69
-10
lines changed

regression/cpp/Method_qualifier1/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
class my_class
44
{

regression/cpp/auto1/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
const auto i=1;
44

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class A
2+
{
3+
public:
4+
void foo() {}
5+
};
6+
7+
class B : public A
8+
{
9+
public:
10+
void foo() = delete;
11+
};
12+
13+
int main()
14+
{
15+
B b;
16+
b.foo();
17+
18+
return 0;
19+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.cpp
3+
-std=c++11
4+
^EXIT=(64|1)$
5+
^SIGNAL=0$
6+
not accessible
7+
--
8+
^warning: ignoring

regression/cpp/switch1/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
int main()
44
{

regression/systemc/Array1/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
#define COPY
44

regression/systemc/Array2/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
class myarray {
44

regression/systemc/Array3/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
#define FUNCTION
44

regression/systemc/Array4/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
#define CLASS
44

regression/systemc/BitvectorCpp1/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
int main(int argc, char** argv)
44
{

regression/systemc/BitvectorCpp2/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
int main(int argc, char** argv)
44
{

regression/systemc/This1/main.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#include <assert.h>
1+
#include <cassert>
22

33
class Foo;
44

src/cpp/cpp_typecheck_compound_type.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -450,6 +450,14 @@ void cpp_typecheckt::typecheck_compound_declarator(
450450

451451
if(is_method)
452452
{
453+
if(
454+
value.id() == ID_code &&
455+
to_code(value).get_statement() == ID_cpp_delete)
456+
{
457+
value.make_nil();
458+
component.set(ID_access, "noaccess");
459+
}
460+
453461
component.set(ID_is_inline, declaration.member_spec().is_inline());
454462

455463
// the 'virtual' name of the function

src/cpp/parse.cpp

+24
Original file line numberDiff line numberDiff line change
@@ -2494,13 +2494,25 @@ bool Parser::rConstructorDecl(
24942494

24952495
case TOK_DEFAULT: // C++0x
24962496
{
2497+
if(!ansi_c_parser.cpp11)
2498+
{
2499+
SyntaxError();
2500+
return false;
2501+
}
2502+
24972503
constructor.value()=codet(ID_default);
24982504
set_location(constructor.value(), value);
24992505
}
25002506
break;
25012507

25022508
case TOK_DELETE: // C++0x
25032509
{
2510+
if(!ansi_c_parser.cpp11)
2511+
{
2512+
SyntaxError();
2513+
return false;
2514+
}
2515+
25042516
constructor.value()=codet(ID_cpp_delete);
25052517
set_location(constructor.value(), value);
25062518
}
@@ -2675,12 +2687,24 @@ bool Parser::rDeclaratorWithInit(
26752687

26762688
if(lex.LookAhead(0)==TOK_DEFAULT) // C++0x
26772689
{
2690+
if(!ansi_c_parser.cpp11)
2691+
{
2692+
SyntaxError();
2693+
return false;
2694+
}
2695+
26782696
lex.get_token(tk);
26792697
declarator.value()=codet(ID_default);
26802698
set_location(declarator.value(), tk);
26812699
}
26822700
else if(lex.LookAhead(0)==TOK_DELETE) // C++0x
26832701
{
2702+
if(!ansi_c_parser.cpp11)
2703+
{
2704+
SyntaxError();
2705+
return false;
2706+
}
2707+
26842708
lex.get_token(tk);
26852709
declarator.value()=codet(ID_cpp_delete);
26862710
set_location(declarator.value(), tk);

0 commit comments

Comments
 (0)