annotate tools/clang/lib/Parse/ParseCbC.cpp @ 90:2ddce554fef0

fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
author Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
date Thu, 16 Apr 2015 17:33:03 +0900
parents 9020ffd06b8b
children ae2ab28b985c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
1 #ifndef noCbC
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
2
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include "clang/Parse/Parser.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include "RAIIObjectsForParser.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5 #include "clang/AST/ASTContext.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6 #include "clang/Basic/Diagnostic.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 #include "clang/Basic/PrettyStackTrace.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
8 #include "clang/Basic/TargetInfo.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 #include "clang/Sema/DeclSpec.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 #include "clang/Sema/PrettyDeclStackTrace.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 #include "clang/Sema/Scope.h"
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 #include "clang/Sema/Lookup.h"
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
13 #include "clang/Lex/LiteralSupport.h"
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
14 #include "clang/AST/ASTConsumer.h"
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
15
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
16 #include <sstream>
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
17 #include <string>
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
18 #include "CbCHelper.h"
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
19
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
20 using namespace clang;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
21
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
22 /// The class which belong to this namespace is from other files' namespace.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
23 /// Because those namespaces are unnamed namespaces, we can't access them.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
24 /// So create this namespace and copy classes from those namespaces.
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
25 namespace ExternalSpace { // from ParseExpr.cpp , ParseStmt.cpp
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
26 class CastExpressionIdValidator : public CorrectionCandidateCallback {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
27 public:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
28 CastExpressionIdValidator(bool AllowTypes, bool AllowNonTypes)
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
29 : AllowNonTypes(AllowNonTypes) {
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
30 WantTypeSpecifiers = AllowTypes;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
31 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
32
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
33 virtual bool ValidateCandidate(const TypoCorrection &candidate) {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
34 NamedDecl *ND = candidate.getCorrectionDecl();
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
35 if (!ND)
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
36 return candidate.isKeyword();
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
37
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
38 if (isa<TypeDecl>(ND))
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
39 return WantTypeSpecifiers;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
40 return AllowNonTypes;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
41 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
43 private:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
44 bool AllowNonTypes;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
45 };
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
47 class StatementFilterCCC : public CorrectionCandidateCallback {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
48 public:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
49 StatementFilterCCC(Token nextTok) : NextToken(nextTok) {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
50 WantTypeSpecifiers = nextTok.is(tok::l_paren) || nextTok.is(tok::less) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
51 nextTok.is(tok::identifier) || nextTok.is(tok::star) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
52 nextTok.is(tok::amp) || nextTok.is(tok::l_square);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
53 WantExpressionKeywords = nextTok.is(tok::l_paren) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
54 nextTok.is(tok::identifier) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
55 nextTok.is(tok::arrow) || nextTok.is(tok::period);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
56 WantRemainingKeywords = nextTok.is(tok::l_paren) || nextTok.is(tok::semi) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
57 nextTok.is(tok::identifier) ||
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
58 nextTok.is(tok::l_brace);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
59 WantCXXNamedCasts = false;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
60 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
62 virtual bool ValidateCandidate(const TypoCorrection &candidate) {
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
63 if (FieldDecl *FD = candidate.getCorrectionDeclAs<FieldDecl>())
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
64 return !candidate.getCorrectionSpecifier() || isa<ObjCIvarDecl>(FD);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
65 if (NextToken.is(tok::equal))
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
66 return candidate.getCorrectionDeclAs<VarDecl>();
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
67 if (NextToken.is(tok::period) &&
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
68 candidate.getCorrectionDeclAs<NamespaceDecl>())
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
69 return false;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
70 return CorrectionCandidateCallback::ValidateCandidate(candidate);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
71 }
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
73 private:
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
74 Token NextToken;
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
75 };
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76 }
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
78
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
79 /// Prepare__retForGotoWithTheEnvExpr - Prepare __CbC_return, code segment for returning and some necessary statements.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
80 /// It is called when the parser find __return and statements are put into complex statement.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
81 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
82 /// examples which are created:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
83 /// complex statement:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
84 /// ({
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
85 /// __code (*__CbC_return)(return_type, void*);
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
86 /// __CbC_return = code_segment_for_return;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
87 /// __CbC_return;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
88 /// });
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
89 /// code segment:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
90 /// __code ret(return_type retval, void *env){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
91 /// *(return_type)((struct CbC_environment *)(env))->ret_p = n;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
92 /// longjmp((int*)(((struct __CbC_environment *)env)->env),1);
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
93 /// }
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
94 ExprResult Parser::Prepare__retForGotoWithTheEnvExpr(){
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
95
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
96 if (isVoidFunction()) { // error check : function type is void or not.
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
97 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "continuation with the environment cannot use in the void function");
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
98 Diag(Tok, DiagID);
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
99 return ExprError();
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
100 }
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
101
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
102 StmtResult innerRes;
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
103 SourceLocation Loc = Tok.getLocation();
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
104 IdentifierInfo *__CbC_retII = CreateIdentifierInfo(__CBC_RETURN_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
105 IdentifierInfo *retcsII = CreateUniqueIdentifierInfo(__CBC_RET_CODE_BASE_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
106 Create__CbC_envStruct(Loc, AS_none);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
107
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
108 Actions.ActOnStartStmtExpr();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
109 StmtResult CompoundStmtRes;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
110 ParseScope CompoundScope(this, Scope::DeclScope);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
111 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),Loc,"in compound statement ('{}')");
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
112 StmtVector CompoundStmts;
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
113
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
114 // create code segment for return to C's function
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
115 CreateRetCS(retcsII);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
116
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
117 // __code (*__CbC_return)();
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
118 innerRes = CreateDeclStmt(__CbC_retII, true, false, DeclSpec::TST___code);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
119 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
120 CompoundStmts.push_back(innerRes.get());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
121
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
122 // __CbC_return = ret;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
123 innerRes = CreateAssignmentStmt(__CbC_retII, retcsII);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
124 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
125 CompoundStmts.push_back(innerRes.get());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
126
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
127 // __CbC_return;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
128 innerRes = CreateComplexStmtRet(__CbC_retII, false);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
129 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
130 CompoundStmts.push_back(innerRes.get());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
131
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
132 CompoundStmtRes = Actions.ActOnCompoundStmt(Loc,Loc,CompoundStmts,true);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
133 ConsumeToken(); // eat the '__return'.
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
134 return Actions.ActOnStmtExpr(Loc, CompoundStmtRes.get(), Loc);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 }
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
137 /// Prepare__envForGotoWithTheEnvExpr - Prepare __CbC_environment, struct __CbC_env and some necessary statements.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
138 /// It is called when the parser find __environment and statements are put into complex statement.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
139 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
140 /// examples which are created:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
141 /// complex statement:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
142 /// ({
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
143 /// struct __CbC_env __CbC_environment;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
144 /// jmp_buf env_buf;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
145 /// return_type retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
146 /// __CbC_environment.ret_p = &retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
147 /// __CbC_environment.env = &env_buf
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
148 /// if (setjmp(__CbC_environment.env)){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
149 /// return retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
150 /// }
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
151 /// &__CbC_environment;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
152 /// });
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
153 /// struct __CbC_env:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
154 /// struct __CbC_env{
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
155 /// void *ret_p,*env;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
156 /// }
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
157 ExprResult Parser::Prepare__envForGotoWithTheEnvExpr(){
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
158
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
159 if (isVoidFunction()) { // error check : function type is void or not.
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
160 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "continuation with the environment cannot use in the void function");
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
161 Diag(Tok, DiagID);
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
162 return ExprError();
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
163 }
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
164
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
165 StmtResult innerRes;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
166 SourceLocation Loc = Tok.getLocation();
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
167 IdentifierInfo *bufII = CreateIdentifierInfo(__CBC_BUF_NAME, Loc);
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
168 IdentifierInfo *retvalII = CreateIdentifierInfo(__CBC_RETVAL_NAME, Loc);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
169 IdentifierInfo *structII = CreateIdentifierInfo(__CBC_STRUCT_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
170 IdentifierInfo *__CbC_envII = CreateIdentifierInfo(__CBC_ENVIRONMENT_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
171 IdentifierInfo *envII = CreateIdentifierInfo(__CBC_STRUCT_ENV_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
172 IdentifierInfo *ret_pII = CreateIdentifierInfo(__CBC_STRUCT_POINTER_NAME, Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
173 Create__CbC_envStruct(Loc, AS_none);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
174 Actions.ActOnStartStmtExpr();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
175 ParseScope CompoundScope(this, Scope::DeclScope);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
176 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),Loc,"in compound statement ('{}')");
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
177 StmtVector CompoundStmts;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
178
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
179 // struct __CbC_env __CbC_environment;
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
180 innerRes = CreateDeclStmt(__CbC_envII, false, false, DeclSpec::TST_struct, structII);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
181 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
182 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
183
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
184 // returnType retval;
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
185 innerRes = CreateDeclStmt(retvalII, false, true);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
186 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
187 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
188
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
189 // jmp_buf env_buf;
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
190 innerRes = CreateDeclStmt(bufII, false, false, DeclSpec::TST_typename, CreateIdentifierInfo("jmp_buf", Loc));
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
191 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
192 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
193
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
194 // __CbC_environment.ret_p = &retval;
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
195 innerRes = CreateAssignmentStmt(__CbC_envII, retvalII, true, true, ret_pII);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
196 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
197 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
198
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
199 // __CbC_environment.env = env_buf;
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
200 innerRes = CreateAssignmentStmt(__CbC_envII, bufII, true, false, envII);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
201 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
202 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
203
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
204 // create statements of setjmp
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
205 innerRes = CreateSjForContinuationWithTheEnv();
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
206 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
207 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
208
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
209 // __CbC_environment;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
210 innerRes = CreateComplexStmtRet(__CbC_envII, true);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
211 if (innerRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
212 CompoundStmts.push_back(innerRes.get());
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
213
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
214 StmtResult CompoundStmtRes = Actions.ActOnCompoundStmt(Loc,Loc,CompoundStmts,true);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
215 ConsumeToken(); // eat the '__environment'.
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
216 return Actions.ActOnStmtExpr(Loc, CompoundStmtRes.get(), Loc);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
217 }
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
218
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
219 /// CreateAssignmentStmt - Create assignment statement such as "aaa = bbb;", "auaua = llll;", etc.
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
220 /// It can create 4 kinds of statement.
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
221 /// 1. common assignment statement:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
222 /// variable '=' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
223 /// 2. LHS variable is member of struct:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
224 /// structVar '.' member '=' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
225 /// 3. RHS variable is address of operand:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
226 /// variable '=' '&' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
227 /// 4. 2+3:
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
228 /// structVar '.' member '=' '&' variable ';'
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
229 StmtResult Parser::CreateAssignmentStmt(IdentifierInfo* LHSII, IdentifierInfo* RHSII, bool LHSisMemberAccess, bool RHShasAmp,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
230 IdentifierInfo* extraLHSII, IdentifierInfo* extraRHSII){
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
231 ExprResult Expr,LHS,RHS;
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
232
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
233 Token Next,LHSToken;
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
234 SourceLocation Loc = Tok.getLocation();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
235 CXXScopeSpec SS;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
236 Next.startToken();
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
237 Next.setKind(tok::period);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
238 LHSToken.startToken();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
239 LHSToken.setLocation(Loc);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
240 LHSToken.setIdentifierInfo(LHSII);
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
241 LHSToken.setKind(tok::annot_primary_expr);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
242 std::unique_ptr<ExternalSpace::StatementFilterCCC> Validator(new ExternalSpace::StatementFilterCCC(Next));
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
243 Sema::NameClassification Classification = Actions.ClassifyName(getCurScope(), SS, LHSII, Loc, Next, false, SS.isEmpty() ? std::move(Validator) : 0);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 setExprAnnotation(LHSToken, Classification.getExpression());
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
245 LHSToken.setAnnotationEndLoc(Loc);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 PP.AnnotateCachedTokens(LHSToken);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
247
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 LHS = getExprAnnotation(LHSToken);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
249
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
250 if (LHSisMemberAccess)
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
251 LHS = LookupMemberAndBuildExpr(extraLHSII, LHS.get(), false);
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
252
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
253 RHS = LookupNameAndBuildExpr(RHSII);
59
322ba4588e4f remove assignment flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 58
diff changeset
254 if (RHShasAmp)
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
255 RHS = Actions.ActOnUnaryOp(getCurScope(), Loc, tok::amp, RHS.get());
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
256
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
257 Expr = Actions.ActOnBinOp(getCurScope(), Loc,tok::equal,LHS.get(),RHS.get());
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
258
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
259 return Actions.ActOnExprStmt(Expr);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
260 }
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
261
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
262 /// CreateDeclStmt - Create declaration statement such as "int aaa;".
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
263 /// If isRetCS is true, create code segment for return to C's function. And Name is name of code segment.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
264 /// If copyType is true, type of variable is copied from callee.
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
265 StmtResult Parser::CreateDeclStmt(IdentifierInfo *II, bool isRetCS, bool copyType, DeclSpec::TST valueType, IdentifierInfo* Name){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
266 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
267 SourceLocation Loc = Tok.getLocation();
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
268 DeclGroupPtrTy DeclGPT;
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
269 ParsingDeclSpec DS(*this);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
270 DeclSpec *DSp;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
271 DSp = &DS;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
272
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
273 setTST(&DS, valueType, Name);
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
274 ParsingDeclarator D(*this, DS, static_cast<Declarator::TheContext>(Declarator::BlockContext));
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
275 D.SetIdentifier(II, Loc);
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
276
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
277 if (isRetCS) {
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
278 D.setEllipsisLoc(SourceLocation());
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
279 bool hadGroupingParens = D.hasGroupingParens();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
280 D.setGroupingParens(true);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
281 D.SetRangeEnd(Loc);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
282 DeclSpec FDS(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
283 DS.Finish(Diags, PP, Policy);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
284
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
285 D.AddTypeInfo(DeclaratorChunk::getPointer(FDS.getTypeQualifiers(), Loc, FDS.getConstSpecLoc(), FDS.getVolatileSpecLoc(),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
286 FDS.getRestrictSpecLoc()), FDS.getAttributes(), SourceLocation());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
287 D.setGroupingParens(hadGroupingParens);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
288
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
289
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
290 ParseScope PrototypeScope(this,Scope::FunctionPrototypeScope|Scope::DeclScope|
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
291 (D.isFunctionDeclaratorAFunctionDeclaration() ? Scope::FunctionDeclarationScope : 0));
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
292 bool HasProto = false;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
293 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
294 SourceLocation EllipsisLoc, RefQualifierLoc, ConstQualifierLoc, VolatileQualifierLoc, RestrictQualifierLoc;
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
295 DeclSpec FPDS(AttrFactory);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
296 bool RefQualifierIsLValueRef = true;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
297 ExceptionSpecificationType ESpecType = EST_None;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
298 SourceRange ESpecRange;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
299 SmallVector<ParsedType, 2> DynamicExceptions;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
300 SmallVector<SourceRange, 2> DynamicExceptionRanges;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
301 ExprResult NoexceptExpr;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
302 CachedTokens *ExceptionSpecTokens = 0;
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
303 ParsedAttributes FnAttrs(AttrFactory);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
304 TypeResult TrailingReturnType;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
305
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
306 ParmVarDecl *Param;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
307 FunctionDecl *CurFunctionDecl = Actions.getCurFunctionDecl();
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
308 QualType CurFuncResQT = CurFunctionDecl->getReturnType();
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
309 TypeSourceInfo *CurFuncTI = Actions.Context.CreateTypeSourceInfo(CurFuncResQT);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
310
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
311 Param = CreateParam();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
312 Param->setTypeSourceInfo(CurFuncTI);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
313 Param->setType(CurFuncResQT);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
314 ParamInfo.push_back(DeclaratorChunk::ParamInfo(0, Loc, Param, 0));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
315 Param = CreateParam(0, 1, DeclSpec::TST_void);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
316 ParamInfo.push_back(DeclaratorChunk::ParamInfo(0, Loc, Param, 0));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
317 HasProto = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
318
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
319 D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto, false, Loc, ParamInfo.data(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
320 ParamInfo.size(), EllipsisLoc, Loc, FPDS.getTypeQualifiers(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
321 RefQualifierIsLValueRef, RefQualifierLoc, ConstQualifierLoc,
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
322 VolatileQualifierLoc, RefQualifierLoc, SourceLocation(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
323 ESpecType, ESpecRange.getBegin(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
324 DynamicExceptions.data(), DynamicExceptionRanges.data(),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
325 DynamicExceptions.size(),
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
326 NoexceptExpr.isUsable() ? NoexceptExpr.get() : 0, ExceptionSpecTokens, Loc, Loc, D, TrailingReturnType),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
327 FnAttrs, Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
328 PrototypeScope.Exit();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
329 DSp = &FDS;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
330 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
331
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
332 SmallVector<Decl *, 8> DeclsInGroup;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
333 Decl *FirstDecl;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
334
60
d4de94500cd9 remove decl flags
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 59
diff changeset
335 if (copyType)
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
336 FirstDecl = HandleDeclAndChangeDeclType(D);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
337 else
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
338 FirstDecl = ParseDeclarationAfterDeclaratorAndAttributes(D);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
339
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
340 D.complete(FirstDecl);
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
341 DeclsInGroup.push_back(FirstDecl);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
342 DeclGPT = Actions.FinalizeDeclaratorGroup(getCurScope(), *DSp, DeclsInGroup);
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
343 return Actions.ActOnDeclStmt(DeclGPT, Loc, Loc);
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
344 }
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
345
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
346
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
347 /// handleDeclAndChangeDeclType - This function imitated Parser::ParseDeclarationAfterDeclaratorAndAttributes() and Sema::ActOnDeclarator().
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
348 /// The origins get Type from Declarator but this function get Type from current function.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
349 /// It is useful for CbC to create statements for the continuation with the environments.
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
350 Decl* Parser::HandleDeclAndChangeDeclType(Declarator &D) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
351 D.setFunctionDefinitionKind(FDK_Declaration);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
352 DeclarationNameInfo NameInfo = Actions.GetNameForDeclarator(D);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
353 DeclContext *DC = Actions.CurContext;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
354 QualType R = Actions.getCurFunctionDecl()->getReturnType(); // copy a type
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
355 TypeSourceInfo *TInfo = Actions.Context.CreateTypeSourceInfo(R); // copy a type infomation
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
356 Scope *S = getCurScope();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
357 LookupResult Previous(Actions, NameInfo, Actions.LookupOrdinaryName, Actions.ForRedeclaration);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
358 bool IsLinkageLookup = false;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
359 bool CreateBuiltins = false;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
360
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
361 // If the declaration we're planning to build will be a function
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
362 // or object with linkage, then look for another declaration with
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
363 // linkage (C99 6.2.2p4-5 and C++ [basic.link]p6).
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
364 //
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
365 // If the declaration we're planning to build will be declared with
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
366 // external linkage in the translation unit, create any builtin with
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
367 // the same name.
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
368 if (R->isFunctionType()) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
369 IsLinkageLookup = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
370 CreateBuiltins =
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
371 Actions.CurContext->getEnclosingNamespaceContext()->isTranslationUnit();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
372 } else if (Actions.CurContext->getRedeclContext()->isTranslationUnit())
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
373 CreateBuiltins = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
374
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
375 if (IsLinkageLookup)
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
376 Previous.clear(Actions.LookupRedeclarationWithLinkage);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
377
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
378 Actions.LookupName(Previous, S, CreateBuiltins);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
379
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
380 // In C++, the previous declaration we find might be a tag type
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
381 // (class or enum). In this case, the new declaration will hide the
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
382 // tag type. Note that this does does not apply if we're declaring a
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
383 // typedef (C++ [dcl.typedef]p4).
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
384 if (Previous.isSingleTagDecl())
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
385 Previous.clear();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
386 NamedDecl *New;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
387 bool AddToScope = true;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
388 if (R->isFunctionType()) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
389 New = Actions.ActOnFunctionDeclarator(S, D, DC, TInfo, Previous,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
390 MultiTemplateParamsArg(), AddToScope);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
391 } else {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
392 New = Actions.ActOnVariableDeclarator(S, D, DC, TInfo, Previous,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
393 MultiTemplateParamsArg(), AddToScope);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
394 }
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
395
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
396 if (New->getDeclName() && AddToScope) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
397 // Only make a locally-scoped extern declaration visible if it is the first
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
398 // declaration of this entity. Qualified lookup for such an entity should
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
399 // only find this declaration if there is no visible declaration of it.
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
400 bool AddToContext = !D.isRedeclaration() || !New->isLocalExternDecl();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
401 Actions.PushOnScopeChains(New, S, AddToContext);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
402 if (!AddToContext)
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
403 Actions.CurContext->addHiddenDecl(New);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
404 }
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
405
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
406 return New;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
407 }
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
408
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
409
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
410 /// CreateSjForContinuationWithEnv - Create statements of setjmp for continuation with the environment.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
411 /// code example:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
412 /// if (setjmp(__CbC_environment.env)){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
413 /// return retval;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
414 /// }
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
415 StmtResult Parser::CreateSjForContinuationWithTheEnv(){
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
416 SourceLocation Loc = Tok.getLocation();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
417 StmtResult IfRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
418 ParseScope IfScope(this, Scope::DeclScope | Scope::ControlScope, true/* C99 or CXX */);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
419 ExprResult CondExp;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
420 Decl *CondVar = 0;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
421
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
422 CondExp = LookupNameAndBuildExpr(CreateIdentifierInfo("setjmp", Loc));
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
423 ExprVector ArgExprs;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
424 ExprResult __envExprRes = CondExp.get();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
425
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
426 __envExprRes = LookupNameAndBuildExpr(CreateIdentifierInfo(__CBC_ENVIRONMENT_NAME, Loc));
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
427 __envExprRes = LookupMemberAndBuildExpr(CreateIdentifierInfo(__CBC_STRUCT_ENV_NAME, Loc), __envExprRes.get(), false);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
428
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
429 ArgExprs.push_back(__envExprRes.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
430 CondExp = Actions.ActOnCallExpr(getCurScope(), CondExp.get(), Loc, ArgExprs, Loc, 0);
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
431 CondExp = Actions.ActOnBooleanCondition(getCurScope(), Loc, CondExp.get());
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
432
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
433 FullExprArg FullCondExp(Actions.MakeFullExpr(CondExp.get(), Loc));
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
434 ParseScope InnerScope(this, Scope::DeclScope,false);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
435 SourceLocation InnerStatementTrailingElseLoc;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
436
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
437 StmtResult StmtRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
438 ParseScope CompoundScope(this, Scope::DeclScope);
44
aabc64b7263e create two declaration statements, env_buf and retval.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
439 PrettyStackTraceLoc CrashInfo(PP.getSourceManager(),Loc,"in create setjmp statement for CbC");
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
440 StmtVector innerStmts;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
441 StmtResult innerStmtRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
442 ExprResult innerExprRes;
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
443 innerExprRes = LookupNameAndBuildExpr(CreateIdentifierInfo(__CBC_RETVAL_NAME, Loc));
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
444 innerStmtRes = Actions.ActOnReturnStmt(Loc, innerExprRes.get(), getCurScope());
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
445 if (innerStmtRes.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
446 innerStmts.push_back(innerStmtRes.get());
41
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
447 StmtRes = Actions.ActOnCompoundStmt(Loc, Loc,innerStmts, false);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
448 StmtResult ThenStmt(StmtRes);
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
449 InnerScope.Exit();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
450 IfScope.Exit();
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
451 StmtResult ElseStmt;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
452 IfRes = Actions.ActOnIfStmt(Loc, FullCondExp, CondVar, ThenStmt.get(),Loc, ElseStmt.get());
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
453 return IfRes;
1d6c745cd57d move some methods to ParseCbC.cpp which were written by me.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff changeset
454 }
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
455
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
456
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
457 /// LookupNameAndBuildExpr - Look up name, create ExprResult and return it.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
458 ExprResult Parser::LookupNameAndBuildExpr(IdentifierInfo *II, bool IsAddressOfOperand){
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
459 SourceLocation Loc = Tok.getLocation();
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
460 UnqualifiedId Name;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
461 CXXScopeSpec SS;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
462 SourceLocation TemplateKWLoc;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
463 std::unique_ptr<ExternalSpace::CastExpressionIdValidator> Validator(new ExternalSpace::CastExpressionIdValidator(false,true));
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
464 Name.setIdentifier(II, Loc);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
465 return Actions.ActOnIdExpression(getCurScope(), SS, TemplateKWLoc, Name, false, IsAddressOfOperand, std::move(Validator));
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
466 }
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
467
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
468 /// LookupMemberAndBuildExpr - Look up member name, create ExprResult and return it.
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
469 /// If IsArrow is true, the name is accessed by arrow operand.
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
470 ExprResult Parser::LookupMemberAndBuildExpr(IdentifierInfo *II, Expr* Base, bool IsArrow){
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
471 SourceLocation Loc = Tok.getLocation();
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
472 CXXScopeSpec SS;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
473 UnqualifiedId Name;
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
474 SourceLocation TemplateKWLoc;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
475 tok::TokenKind OpKind = (IsArrow ? tok::arrow : tok::period);
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
476 Name.setIdentifier(II,Loc);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
477 return Actions.ActOnMemberAccessExpr(getCurScope(), Base, Loc, OpKind, SS, TemplateKWLoc, Name, nullptr, false);
42
3e178477409f made some submethods for the methods which emit CbC statements.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 41
diff changeset
478 }
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
479
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
480
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
481 /// Create__CbC_envStruct - This method create "struct __CbC_env" which is used to continuation with environment.
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
482 /// If the __CbC_env has been already defined, it doesn't create __CbC_env again.
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
483 /// The example of struct which is created :
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
484 /// struct __CbC_env{
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
485 /// void *ret_p,*env;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
486 /// };
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
487 void Parser::Create__CbC_envStruct(SourceLocation Loc, AccessSpecifier AS) {
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
488
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
489 IdentifierInfo *Name = CreateIdentifierInfo(__CBC_STRUCT_NAME, Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
490 // Check previous definition. If the __CbC_env has been already defined, we have not to create again.
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
491 LookupResult Previous(Actions, Name, Loc, Actions.LookupTagName, Actions.ForRedeclaration);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
492 if(Actions.LookupName(Previous, getCurScope()))
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
493 return;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
494
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
495 Scope *SavedScope = getCurScope();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
496 DeclContext *SavedContext = Actions.CurContext;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
497 sema::FunctionScopeInfo *SavedFSI = Actions.FunctionScopes.pop_back_val();
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
498
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
499 Actions.CurContext = static_cast<DeclContext *>(Actions.Context.getTranslationUnitDecl());
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
500 Scope *TopScope = getCurScope();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
501 while(TopScope->getParent() != NULL)
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
502 TopScope = TopScope->getParent();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
503 Actions.CurScope = TopScope;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
504
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
505 ParsingDeclSpec SDS(*this);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
506 SDS.SetRangeStart(Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
507 SDS.SetRangeEnd(Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
508 DeclSpec::TST TagType = DeclSpec::TST_struct;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
509 DeclResult TagOrTempResult = true;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
510 bool Owned = false;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
511 bool IsDependent = false;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
512 ParsedAttributesWithRange attrs(AttrFactory);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
513 MultiTemplateParamsArg TParams;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
514
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
515 TagOrTempResult = Actions.ActOnTag(getCurScope(), TagType, Sema::TUK_Definition, Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
516 SDS.getTypeSpecScope(), Name, Loc, attrs.getList(), AS,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
517 SDS.getModulePrivateSpecLoc(), TParams, Owned, IsDependent,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
518 SourceLocation(), false, clang::TypeResult(), false);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
519
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
520 Decl *TagDecl = TagOrTempResult.get();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
521 PrettyDeclStackTraceEntry CrashInfo(Actions, TagDecl, Loc, "parsing struct/union body");
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
522 ParseScope StructScope(this, Scope::ClassScope|Scope::DeclScope);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
523 Actions.ActOnTagStartDefinition(getCurScope(), TagDecl);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
524 SmallVector<Decl *, 32> FieldDecls;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
525
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
526 FieldDecls.push_back(Create__CbC_envBody(TagDecl, DeclSpec::TST_void, Loc, __CBC_STRUCT_POINTER_NAME));
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
527 FieldDecls.push_back(Create__CbC_envBody(TagDecl, DeclSpec::TST_int, Loc, __CBC_STRUCT_ENV_NAME));
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
528
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
529 Actions.ActOnFields(getCurScope(),Loc, TagDecl, FieldDecls,Loc, Loc,attrs.getList());
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
530 StructScope.Exit();
72
9943a04bf572 remove unnecessary codes
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 65
diff changeset
531 Actions.ActOnTagFinishDefinition(getCurScope(), TagDecl, Loc);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
532
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
533 Actions.CurScope = SavedScope;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
534 Actions.CurContext = SavedContext;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
535 Actions.FunctionScopes.push_back(SavedFSI);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
536 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
537
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
538 /// Create__CbC_envBody - Create void type pointer ret_p and env which are member of __CbC_env.
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
539 Decl* Parser::Create__CbC_envBody(Decl* TagDecl, DeclSpec::TST T, SourceLocation Loc, const char* Name){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
540 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
541 ParsingDeclSpec PDS(*this);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
542 setTST(&PDS, T);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
543 SourceLocation CommaLoc;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
544 ParsingFieldDeclarator DeclaratorInfo(*this, PDS);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
545 DeclaratorInfo.D.setCommaLoc(CommaLoc);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
546 DeclaratorInfo.D.SetRangeEnd(Loc);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
547 DeclSpec DS(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
548 DS.Finish(Diags, PP, Policy);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
549 DeclaratorInfo.D.SetIdentifier(CreateIdentifierInfo(Name, Loc),Loc);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
550
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
551 DeclaratorInfo.D.AddTypeInfo(DeclaratorChunk::getPointer(DS.getTypeQualifiers(), Loc,DS.getConstSpecLoc(),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
552 DS.getVolatileSpecLoc(),DS.getRestrictSpecLoc()),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
553 DS.getAttributes(),SourceLocation());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
554 Decl *Field = Actions.ActOnField(getCurScope(), TagDecl,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
555 DeclaratorInfo.D.getDeclSpec().getSourceRange().getBegin(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
556 DeclaratorInfo.D, DeclaratorInfo.BitfieldSize);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
557 DeclaratorInfo.complete(Field);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
558 return Field;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
559 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
560
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
561 /// CreateIdentifierInfo - Create IdentifierInfo from char pointer.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
562 /// usage :
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
563 /// IdentifierInfo *II = CreateIdentifierInfo(IIName, Location);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
564 IdentifierInfo* Parser::CreateIdentifierInfo(const char* Name, SourceLocation Loc) {
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
565 int length = strlen(Name);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
566 Token TokenForII;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
567 TokenForII.startToken();
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
568 TokenForII.setLocation(Loc);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
569 TokenForII.setLength(length);
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
570 TokenForII.setKind(tok::raw_identifier);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
571 TokenForII.setRawIdentifierData(Name);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
572 IdentifierInfo *II;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
573 II = PP.getIdentifierInfo(TokenForII.getRawIdentifier());
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
574 TokenForII.setIdentifierInfo(II);
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
575 TokenForII.setKind(II->getTokenID());
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
576 return II;
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
577 }
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
578
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
579 /// CreateUniqueIdentifierInfo - Create unique IdentifierInfo.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
580 /// IdentifierInfos have unique name which were created by this function.
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
581 /// Naming conventions :
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
582 /// current 'function name' '..' 'variable name' 'uniqueID'
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
583 /// For example, if current function's name is 'main' and variable name is 'auaua', IdentifierInfo's name is 'main..auaua'.
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
584 IdentifierInfo* Parser::CreateUniqueIdentifierInfo(const char* Name, SourceLocation Loc){
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
585 IdentifierInfo *II;
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
586 std::ostringstream os;
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
587
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
588 os << curFuncName << ".." /* separator */ << Name << UniqueId;
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
589 II = CreateIdentifierInfo(os.str().c_str(), Loc);
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
590 UniqueId++; // Modify the unique ID.
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
591 return II;
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
592 }
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
593
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
594
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
595 /// CreateRetCS - Create code segment which is used for continuation with the environment.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
596 /// create these codes:
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
597 /// __code ret(return_type retval, void *env){
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
598 /// *(return_type)((struct CbC_environment *)(env))->ret_p = n;
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
599 /// longjmp((int*)(((struct __CbC_environment *)env)->env),1);
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
600 /// }
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
601 void Parser::CreateRetCS(IdentifierInfo *csName){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
602 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
603 QualType CurFuncResQT = Actions.getCurFunctionDecl()->getReturnType();
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
604
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
605 Scope *SavedScope = getCurScope();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
606 DeclContext *SavedContext = Actions.CurContext;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
607 TypeSourceInfo *CurFuncTI = Actions.Context.CreateTypeSourceInfo(CurFuncResQT);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
608 sema::FunctionScopeInfo *SavedFSI = Actions.FunctionScopes.pop_back_val();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
609
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
610 Actions.CurContext = static_cast<DeclContext *>(Actions.Context.getTranslationUnitDecl());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
611 Scope *TopScope = getCurScope();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
612 while(TopScope->getParent() != NULL)
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
613 TopScope = TopScope->getParent();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
614 Actions.CurScope = TopScope;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
615
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
616 DeclGroupPtrTy returnDecl = DeclGroupPtrTy();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
617 SourceLocation Loc = Tok.getLocation();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
618 ParsingDeclSpec PDS(*this);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
619 setTST(&PDS, DeclSpec::TST___code);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
620 ParsingDeclarator D(*this, PDS, static_cast<Declarator::TheContext>(Declarator::FileContext));
64
0aa33659e8e4 modified Parser::CreateUniqueIdentifierInfo(). add unique id
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 63
diff changeset
621 D.SetIdentifier(csName, Loc);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
622 ParseScope PrototypeScope(this,Scope::FunctionPrototypeScope|Scope::DeclScope|Scope::FunctionDeclarationScope);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
623 bool IsAmbiguous = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
624 bool HasProto = true;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
625 SmallVector<DeclaratorChunk::ParamInfo, 16> ParamInfo;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
626 SourceLocation EllipsisLoc, RefQualifierLoc, ConstQualifierLoc, VolatileQualifierLoc, RestrictQualifierLoc;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
627 DeclSpec FDS(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
628 bool RefQualifierIsLValueRef = true;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
629 ExceptionSpecificationType ESpecType = EST_None;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
630 SourceRange ESpecRange;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
631 SmallVector<ParsedType, 2> DynamicExceptions;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
632 SmallVector<SourceRange, 2> DynamicExceptionRanges;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
633 ExprResult NoexceptExpr;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
634 CachedTokens *ExceptionSpecTokens = 0;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
635 ParsedAttributes FnAttrs(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
636 TypeResult TrailingReturnType;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
637 ParmVarDecl *Param;
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
638
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
639 IdentifierInfo *retvalII = CreateIdentifierInfo(__CBC_RETVAL_NAME, Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
640 Param = CreateParam(retvalII);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
641 Param->setTypeSourceInfo(CurFuncTI);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
642 Param->setType(CurFuncResQT);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
643
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
644 ParamInfo.push_back(DeclaratorChunk::ParamInfo(retvalII, Loc, Param, 0));
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
645 IdentifierInfo *envII = CreateIdentifierInfo(__CBC_STRUCT_ENV_NAME, Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
646 Param = CreateParam(envII, 1, DeclSpec::TST_void);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
647 ParamInfo.push_back(DeclaratorChunk::ParamInfo(envII, Loc, Param, 0));
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
648
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
649 D.AddTypeInfo(DeclaratorChunk::getFunction(HasProto, IsAmbiguous, Loc, ParamInfo.data(), ParamInfo.size(), EllipsisLoc, Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
650 FDS.getTypeQualifiers(), RefQualifierIsLValueRef, RefQualifierLoc, ConstQualifierLoc,
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
651 VolatileQualifierLoc, RestrictQualifierLoc, SourceLocation(),
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
652 ESpecType, ESpecRange.getBegin(),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
653 DynamicExceptions.data(), DynamicExceptionRanges.data(), DynamicExceptions.size(),
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
654 NoexceptExpr.isUsable() ? NoexceptExpr.get() : 0, ExceptionSpecTokens,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
655 Loc, Loc, D, TrailingReturnType), FnAttrs, Loc);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
656 PrototypeScope.Exit();
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
657
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
658 Decl *TheDecl;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
659 ParseScope BodyScope(this, Scope::FnScope|Scope::DeclScope);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
660 Decl *BodyRes = Actions.ActOnStartOfFunctionDef(getCurScope(), D);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
661
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
662 D.complete(BodyRes);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
663 D.getMutableDeclSpec().abort();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
664 Actions.ActOnDefaultCtorInitializers(BodyRes);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
665 StmtResult FnBody;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
666 StmtVector FnStmts;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
667 StmtResult innerR;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
668 ExprResult retvalAssginmentExpr,LHS;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
669 ExprVector ArgExprs;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
670 CommaLocsTy CommaLocs;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
671 DeclSpec envDS(AttrFactory);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
672 IdentifierInfo *structName = CreateIdentifierInfo(__CBC_STRUCT_NAME, Loc);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
673 setTST(&envDS, DeclSpec::TST_struct, structName);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
674
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
675 Declarator envDInfo(envDS, Declarator::TypeNameContext);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
676 envDInfo.SetRangeEnd(Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
677 DeclSpec starDS(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
678 starDS.Finish(Diags, PP, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
679 envDInfo.SetIdentifier(0,Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
680 envDInfo.AddTypeInfo(DeclaratorChunk::getPointer(starDS.getTypeQualifiers(), Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
681 starDS.getConstSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
682 starDS.getVolatileSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
683 starDS.getRestrictSpecLoc()),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
684 starDS.getAttributes(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
685 SourceLocation());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
686 ExprVector ArgExprs2;
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
687 LHS = LookupNameAndBuildExpr(envII);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
688 ArgExprs2.push_back(LHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
689 LHS = Actions.ActOnParenListExpr(Loc, Loc, ArgExprs2);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
690 Expr *envCastExpr = LHS.get();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
691 TypeSourceInfo *castTInfo = Actions.GetTypeForDeclaratorCast(envDInfo, envCastExpr->getType());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
692 LHS = Actions.MaybeConvertParenListExprToParenExpr(getCurScope(), envCastExpr);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
693 envCastExpr = LHS.get();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
694 LHS = Actions.BuildCStyleCastExpr(Loc, castTInfo, Loc, envCastExpr);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
695 ArgExprs.push_back(LHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
696 LHS = Actions.ActOnParenListExpr(Loc, Loc, ArgExprs);
52
c22698ecb2a9 modified CreateIdentifierInfo and create new function which was named 'CreateUniqueIdentifierInfo'.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 48
diff changeset
697 LHS = LookupMemberAndBuildExpr(CreateIdentifierInfo(__CBC_STRUCT_POINTER_NAME, Loc),
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
698 LHS.get(), true);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
699 Expr *ret_pCastExpr = LHS.get();
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
700 DeclarationName noValDeclName;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
701 TypeSourceInfo *CurFuncTypesPointerTI = Actions.Context.CreateTypeSourceInfo(Actions.BuildPointerType(CurFuncResQT, Loc, noValDeclName));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
702 LHS = Actions.BuildCStyleCastExpr(Loc, CurFuncTypesPointerTI, Loc, ret_pCastExpr);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
703 LHS = Actions.ActOnUnaryOp(getCurScope(), Loc, tok::star, LHS.get());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
704 ExprResult RHS;
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
705 RHS = LookupNameAndBuildExpr(retvalII);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
706
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
707 retvalAssginmentExpr = Actions.ActOnBinOp(getCurScope(), Loc, tok::equal, LHS.get(), RHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
708 innerR = Actions.ActOnExprStmt(retvalAssginmentExpr);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
709 if(innerR.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
710 FnStmts.push_back(innerR.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
711
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
712 ExprResult ljExpr,ljLHS;
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
713 ljExpr = IIToExpr(CreateIdentifierInfo("longjmp", Loc), tok::l_paren);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
714 ExprVector ljArgExprs;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
715 DeclSpec ljDS(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
716 setTST(&ljDS, DeclSpec::TST_struct, structName);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
717
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
718 Declarator ljD(ljDS, Declarator::TypeNameContext);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
719 ljD.SetRangeEnd(Loc);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
720 DeclSpec starDS2(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
721 starDS2.Finish(Diags, PP, Policy);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
722 ljD.ExtendWithDeclSpec(starDS2);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
723 ljD.SetIdentifier(0, Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
724 ljD.AddTypeInfo(DeclaratorChunk::getPointer(ljDS.getTypeQualifiers(), Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
725 ljDS.getConstSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
726 ljDS.getVolatileSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
727 ljDS.getRestrictSpecLoc()),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
728 ljDS.getAttributes(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
729 SourceLocation());
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
730 ljLHS = LookupNameAndBuildExpr(envII);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
731 Expr *ljCastExpr = ljLHS.get();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
732 TypeSourceInfo *ljCastTInfo = Actions.GetTypeForDeclaratorCast(ljD, ljCastExpr->getType());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
733 ljLHS = Actions.BuildCStyleCastExpr(Loc, ljCastTInfo, Loc, ljCastExpr);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
734 ljLHS = Actions.ActOnParenExpr(Loc, Loc, ljLHS.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
735 ljLHS = LookupMemberAndBuildExpr(envII, ljLHS.get(), true);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
736 ljLHS = Actions.ActOnParenExpr(Loc, Loc, ljLHS.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
737 ljArgExprs.push_back(ljLHS.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
738 CommaLocs.push_back(Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
739 ljLHS = Actions.ActOnIntegerConstant(Loc, 1 /* return value for setjmp */);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
740 ljArgExprs.push_back(ljLHS.get());
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
741 ljExpr = Actions.ActOnCallExpr(getCurScope(), ljExpr.get(), Loc, ljArgExprs, Loc, 0);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
742 innerR = Actions.ActOnExprStmt(ljExpr);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
743 if(innerR.isUsable())
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
744 FnStmts.push_back(innerR.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
745 FnBody = Actions.ActOnCompoundStmt(Loc, Loc, FnStmts, false);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
746 BodyScope.Exit();
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
747 TheDecl = Actions.ActOnFinishFunctionBody(BodyRes, FnBody.get());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
748 returnDecl = Actions.ConvertDeclToDeclGroup(TheDecl);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
749 (&Actions.getASTConsumer())->HandleTopLevelDecl(returnDecl.get());
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
750 Actions.CurScope = SavedScope;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
751 Actions.CurContext = SavedContext;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
752 Actions.FunctionScopes.push_back(SavedFSI);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
753 }
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
754
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
755 /// IIToExpr - Create ExprResult from IdentifierInfo.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
756 /// It is used when II is a not primary expression such as not primary types, a function's name, etc.
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
757 ExprResult Parser::IIToExpr(IdentifierInfo *II, tok::TokenKind Kind){
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
758 SourceLocation Loc = Tok.getLocation();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
759 Token Next,IITok;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
760 Next.setKind(Kind);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
761 std::unique_ptr<ExternalSpace::StatementFilterCCC> CCCValidator(new ExternalSpace::StatementFilterCCC(Next));
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
762 CXXScopeSpec SS;
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
763 Sema::NameClassification Classification = Actions.ClassifyName(getCurScope(), SS, II, Loc, Next, false, std::move(CCCValidator));
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
764 IITok.startToken();
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
765 IITok.setLocation(Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
766 IITok.setIdentifierInfo(II);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
767 IITok.setKind(tok::annot_primary_expr);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
768 setExprAnnotation(IITok, Classification.getExpression());
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
769 IITok.setAnnotationEndLoc(Loc);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
770 PP.AnnotateCachedTokens(IITok);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
771 return getExprAnnotation(IITok);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
772 }
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
773
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
774 /// CreateComplexStmtRet - Create return value for complex statements.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
775 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
776 /// ({ /* some statements */
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
777 /// return_value; )};
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
778 /// ^^^^^^^^^^^^^ Create it.
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
779 StmtResult Parser::CreateComplexStmtRet(IdentifierInfo *II, bool IsAddressOfOperand){
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
780 ExprResult ER;
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
781 if (IsAddressOfOperand) {
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
782 ER = LookupNameAndBuildExpr(II, true);
57
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
783 ER = Actions.ActOnUnaryOp(getCurScope(), Tok.getLocation(), tok::amp, ER.get());
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
784 }
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
785 else
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
786 ER = IIToExpr(II,tok::semi);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
787 return Actions.ActOnExprStmt(ER);
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
788 }
88b0e1f890d7 Use complex statements for goto with the environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 56
diff changeset
789
62
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
790 /// CreateParam - Create paramator for functions.
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
791 ///
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
792 /// int funcname(int aua) {
fe2728d9537d add comments
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 61
diff changeset
793 /// ^^^^^^^ Create it.
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
794 ParmVarDecl* Parser::CreateParam(IdentifierInfo *II, int pointerNum, DeclSpec::TST T){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
795 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
796 SourceLocation Loc = Tok.getLocation();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
797 DeclSpec DS(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
798 setTST(&DS, T);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
799 Declarator ParamDeclarator(DS, Declarator::PrototypeContext);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
800 ParamDeclarator.SetIdentifier(II, Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
801 for(int i = 0;i<pointerNum; i++){
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
802 DeclSpec pointerDS(AttrFactory);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
803 pointerDS.Finish(Diags, PP, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
804 ParamDeclarator.AddTypeInfo(DeclaratorChunk::getPointer(pointerDS.getTypeQualifiers(), Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
805 pointerDS.getConstSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
806 pointerDS.getVolatileSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
807 pointerDS.getRestrictSpecLoc()),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
808 pointerDS.getAttributes(),SourceLocation());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
809 }
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
810 ParmVarDecl *Param = dyn_cast<ParmVarDecl>(Actions.ActOnParamDeclarator(getCurScope(), ParamDeclarator));
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
811 return Param;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
812
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
813 }
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
814
63
0d1cf6cb7029 add comments for setTST
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
815 /// setTST - set TypeSpecifierType(TST) DeclSpec.
0d1cf6cb7029 add comments for setTST
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 62
diff changeset
816 /// TST is specifiers the kind of type such as int, double, char, etc.
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
817 void Parser::setTST(DeclSpec *DS, DeclSpec::TST T, IdentifierInfo* Name){
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
818 const PrintingPolicy &Policy = Actions.getASTContext().getPrintingPolicy();
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
819 SourceLocation Loc = Tok.getLocation();
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
820 bool isInvalid = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
821 const char *PrevSpec = 0;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
822 unsigned DiagID = 0;
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
823 CXXScopeSpec SS;
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
824 DS->SetRangeStart(Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
825 DS->SetRangeEnd(Loc);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
826 if (T == DeclSpec::TST_struct) {
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
827 ParsedAttributesWithRange attrs(AttrFactory);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
828 DeclResult TagOrTempResult = true;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
829 bool Owned = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
830 bool IsDependent = false;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
831 MultiTemplateParamsArg TParams;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
832 TagOrTempResult = Actions.ActOnTag(getCurScope(), T, Sema::TUK_Reference, Loc,
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
833 SS, Name, Loc, attrs.getList(), AS_none,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
834 DS->getModulePrivateSpecLoc(),
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
835 TParams, Owned, IsDependent,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
836 SourceLocation(), false,
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
837 clang::TypeResult(), false);
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
838 isInvalid = DS->SetTypeSpecType(T, Loc, Loc, PrevSpec, DiagID, TagOrTempResult.get(), Owned, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
839 }
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
840 else if (T == DeclSpec::TST_typename) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
841 Token Next,TypeTok;
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
842 Next.setKind(tok::identifier);
86
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
843 std::unique_ptr<ExternalSpace::StatementFilterCCC> CCCValidator(new ExternalSpace::StatementFilterCCC(Next));
99580de8d21d Fix compile error to update llvm 3.7
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 81
diff changeset
844 Sema::NameClassification Classification = Actions.ClassifyName(getCurScope(), SS, Name, Loc, Next, false, std::move(CCCValidator));
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
845 TypeTok.startToken();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
846 TypeTok.setLocation(Loc);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
847 TypeTok.setIdentifierInfo(Name);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
848 TypeTok.setKind(tok::annot_typename);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
849 setTypeAnnotation(TypeTok, Classification.getType());
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
850 TypeTok.setAnnotationEndLoc(Loc);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
851 PP.AnnotateCachedTokens(TypeTok);
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
852 if (TypeTok.getAnnotationValue()) {
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
853 ParsedType PT = getTypeAnnotation(TypeTok);
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
854 isInvalid = DS->SetTypeSpecType(T, Loc, PrevSpec, DiagID, PT, Policy);
56
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
855 } else
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
856 DS->SetTypeSpecError();
bdef5c940791 copy the previous function's return type to return value
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 54
diff changeset
857 }
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
858 else
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
859 isInvalid = DS->SetTypeSpecType(T, Loc, PrevSpec, DiagID, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
860
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
861 DS->Finish(Diags, PP, Policy);
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
862 if (isInvalid) {
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
863 assert(PrevSpec && "Method did not return previous specifier!");
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
864 assert(DiagID);
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
865 if (DiagID == diag::ext_duplicate_declspec)
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
866 Diag(Tok, DiagID)
80
67baa08a3894 update to LLVM 3.6
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 74
diff changeset
867 << PrevSpec << FixItHint::CreateRemoval(Tok.getLocation());
48
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
868 else
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
869 Diag(Tok, DiagID) << PrevSpec;
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
870 }
4b59af982ef3 create return function for continuation with the environment automatically, but it can return only int value and it's name is not unique now
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
871 }
45
9ebfb52ddd9b create declaration statement automatically for __CbC_environment
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
872
58
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
873 /// CheckTheSjHeader - Check whether setjmp.h has been already included or not.
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
874 /// If not, include it.
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
875 void Parser::CheckTheSjHeader(){
53
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
876 SourceLocation Loc = Tok.getLocation();
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
877 LookupResult R(Actions, CreateIdentifierInfo("setjmp", Loc), Loc, Actions.LookupOrdinaryName, Actions.ForRedeclaration);
58
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
878 if (!Actions.LookupName(R, getCurScope())){ // look up the setjmp
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
879 if (PP.IncludeHeader(Tok, "setjmp.h"))
01c954c1b51b include setjmp.h automatically without checking __code
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 57
diff changeset
880 ConsumeToken();
53
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
881 }
f679cc5126db include setjmp.h automatically
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 52
diff changeset
882 }
81
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
883
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
884 /// isVoidFunction - Return true if current function return type is void.
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
885 bool Parser::isVoidFunction(){
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
886 return Actions.getCurFunctionDecl()->getReturnType().getTypePtr()->isVoidType();
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
887 }
97a220dc594f if __return or __environment used in void function, compiler emit error.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 80
diff changeset
888
87
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
889 /// ParseCbCGotoStatement
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
890 /// jump-statement:
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
891 /// [CbC] 'goto' codeSegment ';'
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
892 ///
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
893 StmtResult Parser::ParseCbCGotoStatement(ParsedAttributesWithRange &Attrs,StmtVector &Stmts) {
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
894 assert(Tok.is(tok::kw_goto) && "Not a goto stmt!");
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
895 ParseScope CompoundScope(this, Scope::DeclScope);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
896 StmtVector CompoundedStmts;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
897
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
898 SourceLocation gotoLoc = ConsumeToken(); // eat the 'goto'.
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
899 StmtResult gotoRes;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
900 Token TokAfterGoto = Tok;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
901 Stmtsp = &Stmts;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
902
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
903 gotoRes = ParseStatementOrDeclaration(Stmts, false);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
904 if (gotoRes.get() == NULL)
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
905 return StmtError();
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
906 else if (gotoRes.get()->getStmtClass() != Stmt::CallExprClass) { // if it is not function call
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
907 unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, "expected identifier or codesegment call");
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
908 Diag(TokAfterGoto, DiagID);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
909 return StmtError();
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
910 }
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
911
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
912 assert((Attrs.empty() || gotoRes.isInvalid() || gotoRes.isUsable()) &&
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
913 "attributes on empty statement");
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
914 if (!(Attrs.empty() || gotoRes.isInvalid()))
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
915 gotoRes = Actions.ProcessStmtAttributes(gotoRes.get(), Attrs.getList(), Attrs.Range);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
916 if (gotoRes.isUsable())
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
917 CompoundedStmts.push_back(gotoRes.get());
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
918
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
919 // add return; after goto codesegment();
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
920 if (Actions.getCurFunctionDecl()->getReturnType().getTypePtr()->is__CodeType()) {
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
921 ExprResult retExpr;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
922 StmtResult retRes;
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
923 retRes = Actions.ActOnReturnStmt(gotoLoc, retExpr.get(), getCurScope());
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
924 if (retRes.isUsable())
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
925 CompoundedStmts.push_back(retRes.get());
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
926 }
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
927 return Actions.ActOnCompoundStmt(gotoLoc, Tok.getLocation(), CompoundedStmts, false);
ff9ec87918d4 move ParseCbCGotoStatement() to ParseCbC.cpp
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 86
diff changeset
928 }
88
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
929
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
930 /// SearchCodeSegmentDeclaration - Read tokens until we get to the specified code segment declaration.
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
931 /// If we can't find it , return false;
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
932 bool Parser::SearchCodeSegmentDeclaration(std::string Name){
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
933 while(SkipAnyUntil(tok::kw___code, StopBeforeMatch)){
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
934 if(NextToken().is(tok::identifier) && NextToken().getIdentifierInfo()->getName().str() == Name)
88
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
935 return true;
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
936 ConsumeToken();
88
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
937 }
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
938 return false;
e471d82fb99b add SearchCodeSegmentDeclaration()
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
939 }
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
940
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
941 /// CreatePrototypeDeclaration - Create prototype declaration by it's definition.
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
942 void Parser::CreatePrototypeDeclaration(Token IITok){
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
943 // move to the top level scope
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
944 Scope *SavedScope = getCurScope();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
945 DeclContext *SavedContext = Actions.CurContext;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
946 sema::FunctionScopeInfo *SavedFSI = Actions.FunctionScopes.pop_back_val();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
947 Actions.CurContext = static_cast<DeclContext *>(Actions.Context.getTranslationUnitDecl());
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
948 Scope *TopScope = getCurScope();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
949 while(TopScope->getParent() != NULL)
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
950 TopScope = TopScope->getParent();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
951 Actions.CurScope = TopScope;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
952
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
953 Token CachedTokens[3] = {IITok, PP.LookAhead(1)};
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
954 Token SavedToken = Tok;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
955 PP.ClearCache();
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
956 ProtoParsing = true;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
957
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
958 const DirectoryLookup *CurDir;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
959 FileID FID = PP.getSourceManager().createFileID(PP.getCurrentFileLexer()->getFileEntry(), IITok.getLocation(), SrcMgr::C_User);
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
960 PP.EnterSourceFile(FID,CurDir,IITok.getLocation());
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
961 ConsumeToken();
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
962
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
963 if(SearchCodeSegmentDeclaration(IITok.getIdentifierInfo()->getName().str())){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
964 DeclGroupPtrTy ProtoDecl;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
965 ParseTopLevelDecl(ProtoDecl);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
966 // add declaration to AST.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
967 if(ProtoDecl)
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
968 (&Actions.getASTConsumer())->HandleTopLevelDecl(ProtoDecl.get());
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
969 // File Closing
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
970 Token T;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
971 PP.HandleEndOfFile(T, false);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
972
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
973 // recover tokens.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
974 Tok = SavedToken;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
975 PP.RestoreTokens(CachedTokens, 2);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
976
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
977 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
978 else {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
979 // recover tokens.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
980 CachedTokens[2] = Tok;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
981 Tok = SavedToken;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
982 PP.RestoreTokens(CachedTokens, 3);
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
983 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
984
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
985 // move to the previous scope.
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
986 Actions.CurScope = SavedScope;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
987 Actions.CurContext = SavedContext;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
988 Actions.FunctionScopes.push_back(SavedFSI);
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
989
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
990
89
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
991
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
992 ProtoParsing = false;
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
993 }
9020ffd06b8b Create prototype declaration automatically (only support direct continuation)
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 88
diff changeset
994
90
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
995 static bool HasFlagsSet(Parser::SkipUntilFlags L, Parser::SkipUntilFlags R) {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
996 return (static_cast<unsigned>(L) & static_cast<unsigned>(R)) != 0;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
997 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
998
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
999 bool Parser::SkipAnyUntil(tok::TokenKind T, SkipUntilFlags Flags){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1000 const PreprocessorLexer *L = PP.getCurrentLexer();
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1001 while(1){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1002 if(Tok.is(T)){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1003 if (HasFlagsSet(Flags, StopBeforeMatch)) {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1004 // Noop, don't consume the token.
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1005 } else {
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1006 ConsumeAnyToken();
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1007 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1008 return true;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1009 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1010 else if(!PP.isCurrentLexer(L)){
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1011 return false;
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1012 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1013
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1014 ConsumeAnyToken();
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1015 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1016 }
2ddce554fef0 fix bug:LLVM/clang doesn't crash when code segment declaration was not found.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 89
diff changeset
1017
43
7116d17d6428 Two assignment statements, __CbC_environment.env = i_buf and _CbC_environment.ret_p = &retval, were createed automarically when we found __return.
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
1018 #endif