summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST/ExprCXX.cpp
diff options
context:
space:
mode:
authorNico Weber <nicolasweber@gmx.de>2012-10-11 10:13:44 +0000
committerNico Weber <nicolasweber@gmx.de>2012-10-11 10:13:44 +0000
commitcf4ff586e8c2e26041befa0941a6552ad902df2f (patch)
tree2b627ffc3b94e16f4d7878c880b7bed36f7ddeae /clang/lib/AST/ExprCXX.cpp
parente4658e89d771338c429f052730e4a18586e49e19 (diff)
downloadbcm5719-llvm-cf4ff586e8c2e26041befa0941a6552ad902df2f.tar.gz
bcm5719-llvm-cf4ff586e8c2e26041befa0941a6552ad902df2f.zip
Add codegen support for __uuidof().
llvm-svn: 165710
Diffstat (limited to 'clang/lib/AST/ExprCXX.cpp')
-rw-r--r--clang/lib/AST/ExprCXX.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/clang/lib/AST/ExprCXX.cpp b/clang/lib/AST/ExprCXX.cpp
index e6076f007fa..38e9dd1ba55 100644
--- a/clang/lib/AST/ExprCXX.cpp
+++ b/clang/lib/AST/ExprCXX.cpp
@@ -51,6 +51,26 @@ QualType CXXUuidofExpr::getTypeOperand() const {
.getUnqualifiedType();
}
+// static
+UuidAttr *CXXUuidofExpr::GetUuidAttrOfType(QualType QT) {
+ // Optionally remove one level of pointer, reference or array indirection.
+ const Type *Ty = QT.getTypePtr();
+ if (QT->isPointerType() || QT->isReferenceType())
+ Ty = QT->getPointeeType().getTypePtr();
+ else if (QT->isArrayType())
+ Ty = cast<ArrayType>(QT)->getElementType().getTypePtr();
+
+ // Loop all record redeclaration looking for an uuid attribute.
+ CXXRecordDecl *RD = Ty->getAsCXXRecordDecl();
+ for (CXXRecordDecl::redecl_iterator I = RD->redecls_begin(),
+ E = RD->redecls_end(); I != E; ++I) {
+ if (UuidAttr *Uuid = I->getAttr<UuidAttr>())
+ return Uuid;
+ }
+
+ return 0;
+}
+
// CXXScalarValueInitExpr
SourceRange CXXScalarValueInitExpr::getSourceRange() const {
SourceLocation Start = RParenLoc;
OpenPOWER on IntegriCloud