annotate dmd/staticassert.c @ 1650:40bd4a0d4870

Update to work with LLVM 2.7. Removed use of dyn_cast, llvm no compiles without exceptions and rtti by default. We do need exceptions for the libconfig stuff, but rtti isn't necessary (anymore). Debug info needs to be rewritten, as in LLVM 2.7 the format has completely changed. To have something to look at while rewriting, the old code has been wrapped inside #ifndef DISABLE_DEBUG_INFO , this means that you have to define this to compile at the moment. Updated tango 0.99.9 patch to include updated EH runtime code, which is needed for LLVM 2.7 as well.
author Tomas Lindquist Olsen
date Wed, 19 May 2010 12:42:32 +0200
parents 3da302cc4966
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1606
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
1
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
2 // Copyright (c) 1999-2007 by Digital Mars
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
3 // All Rights Reserved
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
4 // written by Walter Bright
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
5 // http://www.digitalmars.com
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
6 // License for redistribution is by either the Artistic License
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
7 // in artistic.txt, or the GNU General Public License in gnu.txt.
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
8 // See the included readme.txt for details.
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
9
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
10 #include <stdio.h>
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
11 #include <string.h>
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
12 #include <assert.h>
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
13
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
14 #include "dsymbol.h"
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
15 #include "staticassert.h"
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
16 #include "expression.h"
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
17 #include "id.h"
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
18 #include "hdrgen.h"
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
19 #include "scope.h"
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
20 #include "template.h"
1615
3da302cc4966 Merge DMD r294: bugzilla 2816 Sudden-death static assert is not...
Leandro Lucarella <llucax@gmail.com>
parents: 1606
diff changeset
21 #include "declaration.h"
1606
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
22
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
23
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
24 /********************************* AttribDeclaration ****************************/
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
25
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
26 StaticAssert::StaticAssert(Loc loc, Expression *exp, Expression *msg)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
27 : Dsymbol(Id::empty)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
28 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
29 this->loc = loc;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
30 this->exp = exp;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
31 this->msg = msg;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
32 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
33
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
34 Dsymbol *StaticAssert::syntaxCopy(Dsymbol *s)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
35 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
36 StaticAssert *sa;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
37
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
38 assert(!s);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
39 sa = new StaticAssert(loc, exp->syntaxCopy(), msg ? msg->syntaxCopy() : NULL);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
40 return sa;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
41 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
42
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
43 int StaticAssert::addMember(Scope *sc, ScopeDsymbol *sd, int memnum)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
44 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
45 return 0; // we didn't add anything
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
46 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
47
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
48 void StaticAssert::semantic(Scope *sc)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
49 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
50 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
51
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
52 void StaticAssert::semantic2(Scope *sc)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
53 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
54 Expression *e;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
55
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
56 //printf("StaticAssert::semantic2() %s\n", toChars());
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
57 e = exp->semantic(sc);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
58 e = e->optimize(WANTvalue | WANTinterpret);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
59 if (e->isBool(FALSE))
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
60 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
61 if (msg)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
62 { HdrGenState hgs;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
63 OutBuffer buf;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
64
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
65 msg = msg->semantic(sc);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
66 msg = msg->optimize(WANTvalue | WANTinterpret);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
67 hgs.console = 1;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
68 msg->toCBuffer(&buf, &hgs);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
69 error("%s", buf.toChars());
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
70 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
71 else
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
72 error("(%s) is false", exp->toChars());
1615
3da302cc4966 Merge DMD r294: bugzilla 2816 Sudden-death static assert is not...
Leandro Lucarella <llucax@gmail.com>
parents: 1606
diff changeset
73 if (sc->tinst)
1606
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
74 sc->tinst->printInstantiationTrace();
1615
3da302cc4966 Merge DMD r294: bugzilla 2816 Sudden-death static assert is not...
Leandro Lucarella <llucax@gmail.com>
parents: 1606
diff changeset
75 if (!global.gag)
1606
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
76 fatal();
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
77 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
78 else if (!e->isBool(TRUE))
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
79 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
80 error("(%s) is not evaluatable at compile time", exp->toChars());
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
81 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
82 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
83
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
84 int StaticAssert::oneMember(Dsymbol **ps)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
85 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
86 //printf("StaticAssert::oneMember())\n");
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
87 *ps = NULL;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
88 return TRUE;
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
89 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
90
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
91 void StaticAssert::inlineScan()
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
92 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
93 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
94
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
95 void StaticAssert::toObjFile(int multiobj)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
96 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
97 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
98
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
99 const char *StaticAssert::kind()
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
100 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
101 return "static assert";
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
102 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
103
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
104 void StaticAssert::toCBuffer(OutBuffer *buf, HdrGenState *hgs)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
105 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
106 buf->writestring(kind());
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
107 buf->writeByte('(');
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
108 exp->toCBuffer(buf, hgs);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
109 if (msg)
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
110 {
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
111 buf->writeByte(',');
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
112 msg->toCBuffer(buf, hgs);
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
113 }
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
114 buf->writestring(");");
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
115 buf->writenl();
1b24e9c7cc26 Use just \n as end of line
Leandro Lucarella <llucax@gmail.com>
parents: 1367
diff changeset
116 }