[cfe-commits] r71965 - /cfe/trunk/lib/Sema/SemaExpr.cpp
Eli Friedman
eli.friedman at gmail.com
Sat May 16 16:27:51 PDT 2009
Author: efriedma
Date: Sat May 16 18:27:50 2009
New Revision: 71965
URL: http://llvm.org/viewvc/llvm-project?rev=71965&view=rev
Log:
Refactor address-of-void extension a bit so that it's more obviously
correct. No functionality change, as far as I know.
Modified:
cfe/trunk/lib/Sema/SemaExpr.cpp
Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=71965&r1=71964&r2=71965&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
+++ cfe/trunk/lib/Sema/SemaExpr.cpp Sat May 16 18:27:50 2009
@@ -4426,14 +4426,10 @@
NamedDecl *dcl = getPrimaryDecl(op);
Expr::isLvalueResult lval = op->isLvalue(Context);
- if (lval != Expr::LV_Valid) { // C99 6.5.3.2p1
+ if (lval != Expr::LV_Valid && lval != Expr::LV_IncompleteVoidType) {
+ // C99 6.5.3.2p1
// The operand must be either an l-value or a function designator
- if (op->getType()->isFunctionType()) {
- // Function designator is valid
- } else if (lval == Expr::LV_IncompleteVoidType) {
- Diag(OpLoc, diag::ext_typecheck_addrof_void)
- << op->getSourceRange();
- } else {
+ if (!op->getType()->isFunctionType()) {
// FIXME: emit more specific diag...
Diag(OpLoc, diag::err_typecheck_invalid_lvalue_addrof)
<< op->getSourceRange();
@@ -4481,6 +4477,13 @@
assert(0 && "Unknown/unexpected decl type");
}
+ if (lval == Expr::LV_IncompleteVoidType) {
+ // Taking the address of a void variable is technically illegal, but we
+ // allow it in cases which are otherwise valid.
+ // Example: "extern void x; void* y = &x;".
+ Diag(OpLoc, diag::ext_typecheck_addrof_void) << op->getSourceRange();
+ }
+
// If the operand has type "type", the result has type "pointer to type".
return Context.getPointerType(op->getType());
}
More information about the cfe-commits
mailing list