[cfe-commits] r40693 - in /cfe/trunk: AST/StmtPrinter.cpp Parse/ParseExpr.cpp Sema/Sema.h Sema/SemaExpr.cpp include/clang/AST/Expr.h include/clang/AST/StmtNodes.def include/clang/Parse/Action.h
Steve Naroff
snaroff at apple.com
Wed Aug 1 15:05:33 PDT 2007
Author: snaroff
Date: Wed Aug 1 17:05:33 2007
New Revision: 40693
URL: http://llvm.org/viewvc/llvm-project?rev=40693&view=rev
Log:
Add AST/Sema support for __builtin_types_compatible_p (a GNU extension).
Todo...still need to call the action from the parser...
Modified:
cfe/trunk/AST/StmtPrinter.cpp
cfe/trunk/Parse/ParseExpr.cpp
cfe/trunk/Sema/Sema.h
cfe/trunk/Sema/SemaExpr.cpp
cfe/trunk/include/clang/AST/Expr.h
cfe/trunk/include/clang/AST/StmtNodes.def
cfe/trunk/include/clang/Parse/Action.h
Modified: cfe/trunk/AST/StmtPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/AST/StmtPrinter.cpp?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/AST/StmtPrinter.cpp (original)
+++ cfe/trunk/AST/StmtPrinter.cpp Wed Aug 1 17:05:33 2007
@@ -481,6 +481,12 @@
OS << ")";
}
+void StmtPrinter::VisitTypesCompatibleExpr(TypesCompatibleExpr *Node) {
+ OS << "__builtin_types_compatible_p(";
+ OS << Node->getArgType1().getAsString() << ",";
+ OS << Node->getArgType2().getAsString() << ")";
+}
+
// C++
Modified: cfe/trunk/Parse/ParseExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Parse/ParseExpr.cpp?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/Parse/ParseExpr.cpp (original)
+++ cfe/trunk/Parse/ParseExpr.cpp Wed Aug 1 17:05:33 2007
@@ -819,12 +819,12 @@
Res = ParseAssignmentExpression();
break;
case tok::kw___builtin_types_compatible_p:
- ParseTypeName();
+ TypeTy *Type1 = ParseTypeName();
if (ExpectAndConsume(tok::comma, diag::err_expected_comma, "",tok::r_paren))
return ExprResult(true);
- ParseTypeName();
+ TypeTy *Type2 = ParseTypeName();
break;
}
Modified: cfe/trunk/Sema/Sema.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/Sema.h?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/Sema/Sema.h (original)
+++ cfe/trunk/Sema/Sema.h Wed Aug 1 17:05:33 2007
@@ -280,6 +280,11 @@
virtual ExprResult ParseStmtExpr(SourceLocation LPLoc, StmtTy *SubStmt,
SourceLocation RPLoc); // "({..})"
+
+ // __builtin_types_compatible_p(type1, type2)
+ virtual ExprResult ParseTypesCompatibleExpr(SourceLocation LPLoc,
+ TypeTy *arg1, TypeTy *arg2,
+ SourceLocation RPLoc);
/// ParseCXXCasts - Parse {dynamic,static,reinterpret,const}_cast's.
virtual ExprResult ParseCXXCasts(SourceLocation OpLoc, tok::TokenKind Kind,
Modified: cfe/trunk/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/Sema/SemaExpr.cpp?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/Sema/SemaExpr.cpp Wed Aug 1 17:05:33 2007
@@ -1565,3 +1565,15 @@
return new StmtExpr(Compound, Ty, LPLoc, RPLoc);
}
+
+Sema::ExprResult Sema::ParseTypesCompatibleExpr(SourceLocation LPLoc,
+ TypeTy *arg1, TypeTy *arg2,
+ SourceLocation RPLoc) {
+ QualType argT1 = QualType::getFromOpaquePtr(arg1);
+ QualType argT2 = QualType::getFromOpaquePtr(arg2);
+
+ assert((!argT1.isNull() && !argT2.isNull()) && "Missing type argument(s)");
+
+ return new TypesCompatibleExpr(Context.IntTy, LPLoc, argT1, argT2, RPLoc);
+}
+
Modified: cfe/trunk/include/clang/AST/Expr.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Expr.h?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/Expr.h (original)
+++ cfe/trunk/include/clang/AST/Expr.h Wed Aug 1 17:05:33 2007
@@ -703,10 +703,9 @@
CompoundStmt *SubStmt;
SourceLocation LParenLoc, RParenLoc;
public:
- StmtExpr(CompoundStmt *substmt, QualType T,
- SourceLocation lp, SourceLocation rp)
- : Expr(StmtExprClass, T), SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) {
- }
+ StmtExpr(CompoundStmt *substmt, QualType T,
+ SourceLocation lp, SourceLocation rp) :
+ Expr(StmtExprClass, T), SubStmt(substmt), LParenLoc(lp), RParenLoc(rp) { }
CompoundStmt *getSubStmt() { return SubStmt; }
const CompoundStmt *getSubStmt() const { return SubStmt; }
@@ -722,6 +721,33 @@
static bool classof(const StmtExpr *) { return true; }
};
+/// TypesCompatibleExpr - GNU builtin-in function __builtin_type_compatible_p.
+/// This AST node represents a function that returns 1 if two *types* (not
+/// expressions) are compatible. The result of this built-in function can be
+/// used in integer constant expressions.
+class TypesCompatibleExpr : public Expr {
+ QualType Type1;
+ QualType Type2;
+ SourceLocation LParenLoc, RParenLoc;
+public:
+ TypesCompatibleExpr(QualType ReturnType, SourceLocation LP,
+ QualType t1, QualType t2, SourceLocation RP) :
+ Expr(TypesCompatibleExprClass, ReturnType), Type1(t1), Type2(t2),
+ LParenLoc(LP), RParenLoc(RP) {}
+
+ QualType getArgType1() { return Type1; }
+ QualType getArgType2() { return Type2; }
+
+ virtual SourceRange getSourceRange() const {
+ return SourceRange(LParenLoc, RParenLoc);
+ }
+ virtual void visit(StmtVisitor &Visitor);
+ static bool classof(const Stmt *T) {
+ return T->getStmtClass() == TypesCompatibleExprClass;
+ }
+ static bool classof(const TypesCompatibleExpr *) { return true; }
+};
+
} // end namespace clang
#endif
Modified: cfe/trunk/include/clang/AST/StmtNodes.def
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/StmtNodes.def?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/include/clang/AST/StmtNodes.def (original)
+++ cfe/trunk/include/clang/AST/StmtNodes.def Wed Aug 1 17:05:33 2007
@@ -67,11 +67,12 @@
// GNU Extensions.
STMT(50, AddrLabel , Expr)
STMT(51, StmtExpr , Expr)
+STMT(52, TypesCompatibleExpr , Expr)
// C++ Expressions.
-STMT(52, CXXCastExpr , Expr)
-STMT(53, CXXBoolLiteralExpr , Expr)
-LAST_EXPR(53)
+STMT(53, CXXCastExpr , Expr)
+STMT(54, CXXBoolLiteralExpr , Expr)
+LAST_EXPR(54)
#undef STMT
#undef FIRST_STMT
Modified: cfe/trunk/include/clang/Parse/Action.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Parse/Action.h?rev=40693&r1=40692&r2=40693&view=diff
==============================================================================
--- cfe/trunk/include/clang/Parse/Action.h (original)
+++ cfe/trunk/include/clang/Parse/Action.h Wed Aug 1 17:05:33 2007
@@ -375,6 +375,12 @@
SourceLocation RPLoc) { // "({..})"
return 0;
}
+ // __builtin_types_compatible_p(type1, type2)
+ virtual ExprResult ParseTypesCompatibleExpr(SourceLocation LPLoc,
+ TypeTy *arg1, TypeTy *arg2,
+ SourceLocation RPLoc) {
+ return 0;
+ }
//===------------------------- C++ Expressions --------------------------===//
More information about the cfe-commits
mailing list