aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--AST/ASTContext.cpp2
-rw-r--r--AST/Type.cpp8
-rw-r--r--Sema/SemaType.cpp2
-rw-r--r--include/clang/AST/ASTContext.h2
-rw-r--r--include/clang/Basic/DiagnosticKinds.def24
-rw-r--r--test/Parser/typeof.c16
6 files changed, 28 insertions, 26 deletions
diff --git a/AST/ASTContext.cpp b/AST/ASTContext.cpp
index 6f7165101e..12de403e3c 100644
--- a/AST/ASTContext.cpp
+++ b/AST/ASTContext.cpp
@@ -584,7 +584,7 @@ QualType ASTContext::getTypedefType(TypedefDecl *Decl) {
return QualType(Decl->TypeForDecl, 0);
}
-QualType ASTContext::getTypeOfType(Expr *tofExpr) {
+QualType ASTContext::getTypeOfExpr(Expr *tofExpr) {
QualType Canonical = tofExpr->getType().getCanonicalType();
// Note: TypeOfExpr's aren't uniqued.
return QualType(new TypeOfExpr(tofExpr, Canonical), 0);
diff --git a/AST/Type.cpp b/AST/Type.cpp
index 15f0968b81..63a681a52c 100644
--- a/AST/Type.cpp
+++ b/AST/Type.cpp
@@ -18,6 +18,8 @@
#include "clang/Basic/TargetInfo.h"
#include "llvm/Support/Streams.h"
#include "llvm/ADT/StringExtras.h"
+#include <sstream>
+
using namespace clang;
Type::~Type() {}
@@ -652,9 +654,9 @@ void OCUVectorType::getAsStringInternal(std::string &S) const {
}
void TypeOfExpr::getAsStringInternal(std::string &InnerString) const {
- // FIXME: output expression, getUnderlyingExpr()->print().
- // At the moment, Stmt::print(std::ostream) doesn't work for us here.
- InnerString = "typeof(<expr>) " + InnerString;
+ std::ostringstream s;
+ getUnderlyingExpr()->print(s);
+ InnerString = "typeof(" + s.str() + ") " + InnerString;
}
void TypeOfType::getAsStringInternal(std::string &S) const {
diff --git a/Sema/SemaType.cpp b/Sema/SemaType.cpp
index a1dd1f7cda..a1e9e1ccc2 100644
--- a/Sema/SemaType.cpp
+++ b/Sema/SemaType.cpp
@@ -105,7 +105,7 @@ static QualType ConvertDeclSpecToType(const DeclSpec &DS, ASTContext &Ctx) {
Expr *E = static_cast<Expr *>(DS.getTypeRep());
assert(E && "Didn't get an expression for typeof?");
// TypeQuals handled by caller.
- return Ctx.getTypeOfType(E);
+ return Ctx.getTypeOfExpr(E);
}
}
}
diff --git a/include/clang/AST/ASTContext.h b/include/clang/AST/ASTContext.h
index 5d4c11b9cd..240f54689d 100644
--- a/include/clang/AST/ASTContext.h
+++ b/include/clang/AST/ASTContext.h
@@ -101,7 +101,7 @@ public:
QualType getTypedefType(TypedefDecl *Decl);
/// getTypeOfType - GCC extension.
- QualType getTypeOfType(Expr *e);
+ QualType getTypeOfExpr(Expr *e);
QualType getTypeOfType(QualType t);
/// getTagDeclType - Return the unique reference to the type for the
diff --git a/include/clang/Basic/DiagnosticKinds.def b/include/clang/Basic/DiagnosticKinds.def
index f700fa24bf..acf8296414 100644
--- a/include/clang/Basic/DiagnosticKinds.def
+++ b/include/clang/Basic/DiagnosticKinds.def
@@ -604,21 +604,21 @@ DIAG(err_typecheck_indirection_requires_pointer, ERROR,
"indirection requires pointer operand ('%0' invalid)")
DIAG(err_typecheck_deref_incomplete_type, ERROR,
"dereferencing pointer to incomplete type '%0'")
-DIAG(ext_typecheck_deref_ptr_to_void, EXTENSION,
+DIAG(ext_typecheck_deref_ptr_to_void, WARNING,
"dereferencing '%0' pointer")
DIAG(err_typecheck_invalid_operands, ERROR,
"invalid operands to binary expression ('%0' and '%1')")
-DIAG(ext_typecheck_comparison_of_pointer_integer, EXTENSION,
+DIAG(ext_typecheck_comparison_of_pointer_integer, WARNING,
"comparison between pointer and integer")
DIAG(err_typecheck_assign_const, ERROR,
"read-only variable is not assignable")
DIAG(err_typecheck_assign_incompatible, ERROR,
"incompatible types assigning '%1' to '%0'")
-DIAG(ext_typecheck_assign_pointer_int, EXTENSION,
+DIAG(ext_typecheck_assign_pointer_int, WARNING,
"incompatible types assigning '%1' to '%0'")
-DIAG(ext_typecheck_assign_incompatible_pointer, EXTENSION,
+DIAG(ext_typecheck_assign_incompatible_pointer, WARNING,
"incompatible pointer types assigning '%1' to '%0'")
-DIAG(ext_typecheck_assign_discards_qualifiers, EXTENSION,
+DIAG(ext_typecheck_assign_discards_qualifiers, WARNING,
"assigning '%1' to '%0' discards qualifiers")
DIAG(err_typecheck_array_not_modifiable_lvalue, ERROR,
"array type '%0' is not assignable")
@@ -638,11 +638,11 @@ DIAG(err_typecheck_call_too_many_args, ERROR,
"too many arguments to function")
DIAG(err_typecheck_passing_incompatible, ERROR,
"incompatible types passing '%0' to function expecting '%1'")
-DIAG(ext_typecheck_passing_incompatible_pointer, EXTENSION,
+DIAG(ext_typecheck_passing_incompatible_pointer, WARNING,
"incompatible pointer types passing '%0' to function expecting '%1'")
-DIAG(ext_typecheck_passing_pointer_int, EXTENSION,
+DIAG(ext_typecheck_passing_pointer_int, WARNING,
"incompatible types passing '%1' to function expecting '%0'")
-DIAG(ext_typecheck_passing_discards_qualifiers, EXTENSION,
+DIAG(ext_typecheck_passing_discards_qualifiers, WARNING,
"passing '%0' to '%1' discards qualifiers")
DIAG(err_typecheck_cond_expect_scalar, ERROR,
"used type '%0' where arithmetic or pointer type is required")
@@ -650,7 +650,7 @@ DIAG(err_typecheck_expect_scalar_operand, ERROR,
"operand of type '%0' where arithmetic or pointer type is required")
DIAG(err_typecheck_cond_incompatible_operands, ERROR,
"incompatible operand types ('%0' and '%1')")
-DIAG(ext_typecheck_cond_incompatible_pointers, EXTENSION,
+DIAG(ext_typecheck_cond_incompatible_pointers, WARNING,
"pointer type mismatch ('%0' and '%1')")
DIAG(warn_unused_expr, WARNING,
@@ -667,11 +667,11 @@ DIAG(err_case_not_in_switch, ERROR,
"'case' statement not in switch statement")
DIAG(err_typecheck_return_incompatible, ERROR,
"incompatible type returning '%1', expected '%0'")
-DIAG(ext_typecheck_return_pointer_int, EXTENSION,
+DIAG(ext_typecheck_return_pointer_int, WARNING,
"incompatible type returning '%1', expected '%0'")
-DIAG(ext_typecheck_return_incompatible_pointer, EXTENSION,
+DIAG(ext_typecheck_return_incompatible_pointer, WARNING,
"incompatible pointer type returning '%1', expected '%0'")
-DIAG(ext_typecheck_return_discards_qualifiers, EXTENSION,
+DIAG(ext_typecheck_return_discards_qualifiers, WARNING,
"returning '%1' from function expecting '%0' discards qualifiers")
DIAG(err_typecheck_statement_requires_scalar, ERROR,
"statement requires expression of scalar type ('%0' invalid)")
diff --git a/test/Parser/typeof.c b/test/Parser/typeof.c
index 8556687123..14025e5809 100644
--- a/test/Parser/typeof.c
+++ b/test/Parser/typeof.c
@@ -1,23 +1,23 @@
-// RUN: clang -parse-ast-check %s -pedantic
+// RUN: clang -parse-ast-check %s
typedef int TInt;
static void test() {
int *pi;
- int typeof (int) aIntInt; // expected-error{{cannot combine with previous 'int' declaration specifier}} expected-warning{{extension used}}
- short typeof (int) aShortInt; // expected-error{{'short typeof' is invalid}} expected-warning{{extension used}}
+ int typeof (int) aIntInt; // expected-error{{cannot combine with previous 'int' declaration specifier}}
+ short typeof (int) aShortInt; // expected-error{{'short typeof' is invalid}}
int int ttt; // expected-error{{cannot combine with previous 'int' declaration specifier}}
- typeof(TInt) anInt; // expected-warning{{extension used}}
+ typeof(TInt) anInt;
short TInt eee; // expected-error{{parse error}}
void ary[7] fff; // expected-error{{array has incomplete element type 'void'}} expected-error{{parse error}}
- typeof(void ary[7]) anIntError; // expected-warning{{extension used}} expected-error{{expected ')'}} expected-error{{to match this '('}}
- typeof(const int) aci; // expected-warning{{extension used}}
- const typeof (*pi) aConstInt; // expected-warning{{extension used}}
+ typeof(void ary[7]) anIntError; // expected-error{{expected ')'}} expected-error{{to match this '('}}
+ typeof(const int) aci;
+ const typeof (*pi) aConstInt;
int xx;
int *i;
i = aci; // expected-warning{{incompatible types assigning 'typeof(int const)' to 'int *'}}
i = anInt; // expected-warning{{incompatible types assigning 'typeof(TInt)' to 'int *'}}
- i = aConstInt; // expected-warning{{incompatible types assigning 'typeof(<expr>) const' to 'int *'}}
+ i = aConstInt; // expected-warning{{incompatible types assigning 'typeof(*pi) const' to 'int *'}}
i = xx; // expected-warning{{incompatible types assigning 'int' to 'int *'}}
}